標籤:style blog java color 使用 檔案
先準備兩個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