xstream實現對象的序列化和反序列化(Java)


概述

  最新整理Java方面XML序列化和反序列化的常用工具類,找到了dom4j和xstream。dom4j相對小巧,很好的解讀xml;但是對於對象的xml序列化和反序列化,我還是比較喜歡xsteam(ps:個人愛好吧),這里整理xstream的入門基礎知識;

使用

引用maven內容

        <dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.4.8</version>
        </dependency>

別名配置的方式

1、可以通過類注解實現@XStreamAlias,比如XStreamAlias("book");

采用這種方式的時候,需要注意xStream實例化的時候,加上 xStream.processAnnotations(Bookstore.class); //通過注解方式的,一定要有這句話

2、可以通過配置Xstream設置實現;比如xStream.alias("book",book.class);

其他注意事項

1、將某一個類的屬性,作為xml頭信息的屬性,而不是子節點  ,需要使用useAttributeFor,比如:xStream.useAttributeFor(book.class,"id");

2、隱藏跟屬性節點的時候,需要使用addImplicitCollection,比如:xStream.addImplicitCollection(Bookstore.class,"books");

3、在Spring Boot下使用,XML轉對象時,同一個類無法進行轉換,原因是因為SpringBoot重新加載了對象;若未指定classloader的時候,SpringBoot未正確使用classloader,需要指定classloader,需要在方法中指定加載的類,添加如下代碼: xstream.setClassLoader(clazz.getClassLoader());

完整代碼如下:

Bookstore類:

package com.dbgo.xmldemo;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import java.util.List;
@XStreamAlias("bookstore")
public class Bookstore {
    private List<book> books;

    public Bookstore(List<book> books) {
        this.books = books;
    }
    public List<book> getBooks() {
        return books;
    }
    public void setBooks(List<book> books) {
        this.books = books;
    }
}

book類

package com.dbgo.xmldemo;

import com.thoughtworks.xstream.annotations.XStreamAlias;

@XStreamAlias("book")
public class book {
    private Integer id;
    private String name;
    private String author;
    private String year;
    private double price;

    public book(Integer id, String name, String author, String year, double price) {
        this.id = id;
        this.name = name;
        this.author = author;
        this.year = year;
        this.price = price;
    }

    ....省略get/set屬性....
}

使用類注解解析方法

   protected static void XstreamDemo(String xmsource)
    {
        XStream xStream=new XStream();
        xStream.addImplicitCollection(Bookstore.class,"books");
        xStream.processAnnotations(Bookstore.class); //通過注解方式的,一定要有這句話
        xStream.processAnnotations(book.class);
     xstream.setClassLoader(Bookstore.class.getClassLoader());//在spring boot一定加上這句話 Object bookstore2
= xStream.fromXML(xmsource); String xmocontent=xStream.toXML(bookstore2); System.out.println(xmocontent); //Bookstore bookstore1= (Bookstore)xStream.fromXML(xmocontent); }

使用非類注解方法

   protected static void XstreamDemo(String xmsource)
    {
        XStream xStream=new XStream();
        xStream.alias("book",book.class);
        xStream.alias("bookstore",Bookstore.class);
        xStream.useAttributeFor(book.class,"id");
        xStream.addImplicitCollection(Bookstore.class,"books");       
        Object bookstore2= xStream.fromXML(xmsource);
        Bookstore bookstore=new Bookstore(new ArrayList<>());
        bookstore.getBooks().add(new book(1,"zhang","hi","23",34));
        String xmocontent=xStream.toXML(bookstore);
        System.out.println(xmocontent);
        //Bookstore bookstore1= (Bookstore)xStream.fromXML(xmocontent);

    }

xml報文如下

String xmlSource="<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
                "<bookstore>" +
                "    <book id=\"1\">" +
                "        <name>冰與火之歌</name>" +
                "        <author>喬治馬丁</author>" +
                "        <year>2014</year>" +
                "        <price>89</price>" +
                "    </book>" +
                "    <book id=\"2\">" +
                "        <name>安徒生童話</name>" +
                "        <year>2004</year>" +
                "        <price>77</price>" +
                "        <author>English</author>" +
                "    </book>    " +
                "</bookstore>";

參考博客

java生成解析xml的另外兩種方法Xstream  https://www.cnblogs.com/happyPawpaw/p/4972650.html

java+xstream實現xml序列化  https://blog.csdn.net/jaryle/article/details/54893582

Bookstore.class


免責聲明!

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



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