XStream的基本使用

來源:互聯網
上載者:User

標籤: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

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.