XStream的基本使用


先准備兩個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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM