先準備兩個beanjava
1 public class Book { 2 private int bookId; 3 private String bookName; 4 private String bookCode; 5 6 ...(get和set方法省略) 7 }
public class BookShelf { private int number; private List<Book> books; private String remark; private Date date; public BookShelf(){ books=new ArrayList<Book>(); } ...(get和set方法省略) }
使用編程
1 Book book1=new Book(); 2 book1.setBookCode("001"); 3 book1.setBookId(1); 4 book1.setBookName("java編程"); 5 Book book2=new Book(); 6 book2.setBookCode("002"); 7 book2.setBookId(2); 8 book2.setBookName("jsp編程"); 9 BookShelf bookShelf=new BookShelf(); 10 bookShelf.setNumber(1); 11 bookShelf.setRemark("第一個書架"); 12 bookShelf.getBooks().add(book1); 13 bookShelf.getBooks().add(book2); 14 bookShelf.setDate(new Date()); 15 16 XStream xStream=new XStream(new DomDriver()); 17 String str= xStream.toXML(bookShelf); 18 System.out.println(str);
輸出結果:jsp
<xml.BookShelf> <number>1</number> <books> <xml.Book> <bookId>1</bookId> <bookName>java編程</bookName> <bookCode>001</bookCode> </xml.Book> <xml.Book> <bookId>2</bookId> <bookName>jsp編程</bookName> <bookCode>002</bookCode> </xml.Book> </books> <remark>第一個書架</remark> <date>2014-07-04 07:03:34.485 UTC</date> </xml.BookShelf>
輸出的結果裏,類名轉換爲節點名,但前面多了個xml(不爽),時間格式字符串也不爽,那下面就來改造一下吧!ide
一、先處理一下時間格式問題,這個須要咱們本身定義date類型的字段要怎麼轉換,固然xstream爲咱們提供了接口,實現它吧spa
public class MuConverter implements Converter { //判斷字段是否屬於要轉換的類型 @Override public boolean canConvert(Class paramClass) { return Date.class.isAssignableFrom(paramClass); } //對象轉化爲xml @Override public void marshal(Object object, HierarchicalStreamWriter writer, MarshallingContext context) { SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd"); writer.setValue(format.format(object)); } //xml轉化爲對象 @Override public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { try { Date date= DateFormat.getInstance().parse(reader.getValue()); return date; } catch (ParseException e) { return null; } } }
二、爲各字段換個名字code
xStream.alias("BookShelf", BookShelf.class); xStream.alias("Book", Book.class); //修改節點名稱 xStream.aliasField("other", BookShelf.class,"remark"); //字段不作爲節點,而是屬性 xStream.aliasAttribute(Book.class, "bookId", "id"); xStream.useAttributeFor(Book.class, "bookId"); //去掉集體節點的父節點 //xStream.addImplicitCollection(BookShelf.class, "books"); //自定義轉換器 xStream.registerConverter(new MuConverter());*/
輸出結果orm
<BookShelf> <number>1</number> <books> <Book id="1"> <bookName>java編程</bookName> <bookCode>001</bookCode> </Book> <Book id="2"> <bookName>jsp編程</bookName> <bookCode>002</bookCode> </Book> </books> <other>第一個書架</other> <date>2014-07-04</date> </BookShelf>
三、若是以爲上面的指定代碼太複雜了,也能夠使用註解來實現
首先來看兩個beanxml
@XStreamAlias("Book") public class Book { @XStreamAlias("id") @XStreamAsAttribute private int bookId; private String bookName; private String bookCode; ... }
@XStreamAlias("BookShelf") public class BookShelf { private int number; //去掉集體節點的父節點 //@XStreamImplicit private List<Book> books; private String remark; @XStreamConverter(MuConverter.class) private Date date; public BookShelf(){ books=new ArrayList<Book>(); } ... }
沒有註解的字段按字段名默認來轉換
直接調用方法便可對象
xStream.autodetectAnnotations(true); //也能夠分別調用 //xStream.processAnnotations(BookShelf.class); //xStream.processAnnotations(Book.class);
上面的是對象轉換爲xml,如今來實現xml轉換爲對象,很簡單(注意:xml轉換成對象,須要經過上面的別名或註解的方式來指明轉換,不能直接調用下面的代碼)blog
XStream xStream=new XStream(new DomDriver()); xStream.autodetectAnnotations(true); BookShelf bookShelf2=(BookShelf)xStream.fromXML(str);
序列化和反序列化支持
很少說,直接上代碼
一、反序列化
ObjectInputStream input=xStream.createObjectInputStream(inputStream);
BookShelf bookShelf=(BookShelf)input.readObject();
二、序列化
ObjectOutputStream out=xstream.createObjectOutputStream(outputStream);
out.writeObject(bookShelf);
out.close();
三、PrettyPrintWriter、CompactWriter這兩個是XStream自帶的用於輸出xml文件,區別在於後者輸出的xml是鏈接的,前者輸出的是有格式的xml