概述
最新整理Java方面XML序列化和反序列化的常用工具類,找到了dom4j和xstream。dom4j相對小巧,很好的解讀xml;但是對於對象的xml序列化和反序列化,我還是比較喜歡xsteam(ps:個人愛好吧),這里整理xstream的入門基礎知識;
使用
引用maven內容
<dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>1.4.8</version> </dependency>
別名配置的方式
1、可以通過類注解實現@XStreamAlias,比如XStreamAlias("book");
采用這種方式的時候,需要注意xStream實例化的時候,加上 xStream.processAnnotations(Bookstore.class); //通過注解方式的,一定要有這句話
2、可以通過配置Xstream設置實現;比如xStream.alias("book",book.class);
其他注意事項
1、將某一個類的屬性,作為xml頭信息的屬性,而不是子節點 ,需要使用useAttributeFor,比如:xStream.useAttributeFor(book.class,"id");
2、隱藏跟屬性節點的時候,需要使用addImplicitCollection,比如:xStream.addImplicitCollection(Bookstore.class,"books");
3、在Spring Boot下使用,XML轉對象時,同一個類無法進行轉換,原因是因為SpringBoot重新加載了對象;若未指定classloader的時候,SpringBoot未正確使用classloader,需要指定classloader,需要在方法中指定加載的類,添加如下代碼: xstream.setClassLoader(clazz.getClassLoader());
完整代碼如下:
Bookstore類:
package com.dbgo.xmldemo; import com.thoughtworks.xstream.annotations.XStreamAlias; import java.util.List; @XStreamAlias("bookstore") public class Bookstore { private List<book> books; public Bookstore(List<book> books) { this.books = books; } public List<book> getBooks() { return books; } public void setBooks(List<book> books) { this.books = books; } }
book類
package com.dbgo.xmldemo; import com.thoughtworks.xstream.annotations.XStreamAlias; @XStreamAlias("book") public class book { private Integer id; private String name; private String author; private String year; private double price; public book(Integer id, String name, String author, String year, double price) { this.id = id; this.name = name; this.author = author; this.year = year; this.price = price; } ....省略get/set屬性.... }
使用類注解解析方法
protected static void XstreamDemo(String xmsource) { XStream xStream=new XStream(); xStream.addImplicitCollection(Bookstore.class,"books"); xStream.processAnnotations(Bookstore.class); //通過注解方式的,一定要有這句話 xStream.processAnnotations(book.class);
xstream.setClassLoader(Bookstore.class.getClassLoader());//在spring boot一定加上這句話 Object bookstore2= xStream.fromXML(xmsource); String xmocontent=xStream.toXML(bookstore2); System.out.println(xmocontent); //Bookstore bookstore1= (Bookstore)xStream.fromXML(xmocontent); }
使用非類注解方法
protected static void XstreamDemo(String xmsource) { XStream xStream=new XStream(); xStream.alias("book",book.class); xStream.alias("bookstore",Bookstore.class); xStream.useAttributeFor(book.class,"id"); xStream.addImplicitCollection(Bookstore.class,"books"); Object bookstore2= xStream.fromXML(xmsource); Bookstore bookstore=new Bookstore(new ArrayList<>()); bookstore.getBooks().add(new book(1,"zhang","hi","23",34)); String xmocontent=xStream.toXML(bookstore); System.out.println(xmocontent); //Bookstore bookstore1= (Bookstore)xStream.fromXML(xmocontent); }
xml報文如下
String xmlSource="<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<bookstore>" + " <book id=\"1\">" + " <name>冰與火之歌</name>" + " <author>喬治馬丁</author>" + " <year>2014</year>" + " <price>89</price>" + " </book>" + " <book id=\"2\">" + " <name>安徒生童話</name>" + " <year>2004</year>" + " <price>77</price>" + " <author>English</author>" + " </book> " + "</bookstore>";
參考博客
java生成解析xml的另外兩種方法Xstream https://www.cnblogs.com/happyPawpaw/p/4972650.html
java+xstream實現xml序列化 https://blog.csdn.net/jaryle/article/details/54893582
Bookstore.class