先准備兩個bean
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);
輸出結果:
<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(不爽),時間格式字符串也不爽,那下面就來改造一下吧!
1、先處理一下時間格式問題,這個需要我們自己定義date類型的字段要怎么轉換,當然xstream為我們提供了接口,實現它吧
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; } } }
2、為各字段換個名字
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());*/
輸出結果
<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>
3、如果覺得上面的指定代碼太復雜了,也可以使用注解來實現
首先來看兩個bean
@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轉換成對象,需要通過上面的別名或注解的方式來指明轉換,不能直接調用下面的代碼)
XStream xStream=new XStream(new DomDriver()); xStream.autodetectAnnotations(true); BookShelf bookShelf2=(BookShelf)xStream.fromXML(str);
序列化和反序列化支持
不多說,直接上代碼
1、反序列化
ObjectInputStream input=xStream.createObjectInputStream(inputStream);
BookShelf bookShelf=(BookShelf)input.readObject();
2、序列化
ObjectOutputStream out=xstream.createObjectOutputStream(outputStream);
out.writeObject(bookShelf);
out.close();
3、PrettyPrintWriter、CompactWriter
這兩個是XStream自帶的用於輸出xml文件,區別在於后者輸出的xml是連接的,前者輸出的是有格式的xml
