一、前言
關注微信公眾號回復【源碼】獲取文章中源碼,以及封裝的工具類
1、XStream官網
http://x-stream.github.io
2、XStream是什么
XStream是一個簡單的基於Java的類庫,用來將Java對象序列化成XML(JSON)或反序列化為對象(即:可以輕易的將Java對象和XML文檔相互轉換)
3、XSteam能干什么
XStream在運行時使用Java反射機制對要進行序列化的對象樹的結構進行探索,並不需要對對象作出修改。XStream可以序列化內部字段,包括私private和final字段,並且支持非公開類以及內部類。
在缺省情況下,XStream不需要配置映射關系,對象和字段將映射為同名XML元素。但是當對象和字段名與XML中的元素名不同時,XStream支持指定別名。XStream支持以方法調用的方式,或是Java 標注的方式指定別名。
XStream在進行數據類型轉換時,使用系統缺省的類型轉換器。同時,也支持用戶自定義的類型轉換器。
4、XStream特點
-
使用方便 - XStream的API提供了一個高層次外觀,以簡化常用的用例
-
無需創建映射 - XStream的API提供了默認的映射大部分對象序列化
-
性能 - XStream快速和低內存占用,適合於大對象圖或系統
-
干凈的XML - XStream創建一個干凈和緊湊XML結果,這很容易閱讀
-
不需要修改對象 - XStream可序列化的內部字段,如private和final字段,支持非公開類和內部類。默認構造函數不是強制性的要求
-
完整對象圖支持 - XStream允許保持在對象模型中遇到的重復引用,並支持循環引用
-
可自定義的轉換策略 - 定制策略可以允許特定類型的定制被表示為XML的注冊
-
安全框架 - XStream提供了一個公平控制有關解組的類型,以防止操縱輸入安全問題
-
錯誤消息 - 出現異常是由於格式不正確的XML時,XStream拋出一個統一的例外,提供了詳細的診斷,以解決這個問題
-
另一種輸出格式 - XStream支持其它的輸出格式,如JSON
5、XStream常見的用途
傳輸、持久化、配置、單元測試
二、XStream入門
1、添加XSteam依賴
2、XStream基本使用
3、程序運行結果
注意:文中使用到的Lombok注解,Lombok依賴自行添加;XStream序列化XML時需要引用的jar包:xstream-[version].jar、xpp3-[version].jar、xmlpull-[version].jar,當引入xstream依賴后會自動依賴xpp3、xmlpull依賴。XStream序列化JSON需要引用的jar包:jettison-[version].jar。
使用XStream序列化時,對JavaBean沒有任何限制。JavaBean的字段可以是私有的,也可以沒有getter或setter方法,還可以沒有默認的構造函數。
XStream序列化XML時可以允許用戶使用不同的XML解析器,用戶可以使用一個標准的JAXP DOM解析器或自Java 6集成STAX解析器。這樣用戶就不需要依賴xpp3-[version].jar。
三、XStream混疊
1、混疊是一種技術來定制生成XML或者使用XStream特定的格式化XML。假設,一個下面的XML格式是用於序列化/反序列化Student對象。
2、根椐上面的XML格式,我們創建實體類
3、執行代碼
4、驗證輸出
在上面的結果,我們已經看到了Student對象名稱是完全合格的。要替換它作為學生的標簽,按照四、XStream類混疊的步驟
另外,在上述結果中可以看出,所需studentName要重命名來命名。要替換它,按照五、XStream字段混疊的步驟
在上面的結果,我們可以看到手機標記被添加成為手機列表。替換它,按照六、XStream隱式集合混疊的步驟
在上面的結果,我們可以看到這個名字來作為一個子節點,需要將它作為根節點的屬性。替換它,按照七、XStream屬性混疊的步驟
四、XStream類混疊
1、類混疊是用來創建一個類的XML完全限定名稱的別名。讓我們修改XStreamTest02例子,將下面的代碼添加到XStreamTest02例子里面
2、執行代碼
3、執行結果
可以看到<io.github.xstream.test02.Student>和<io.github.xstream.test02.Phone>分別被修改為了<student>和<phone>
五、XStream字段混疊
1、字段混疊用於創建以XML字段的別名。讓我們再次修改原來的XStreamTest02例子,將下面的代碼添加到XStreamTest02例子里面
2、執行代碼
3、執行結果
可以看到<studentName>被修改為了<name>
六、XStream隱式集合混疊
1、隱式集合混疊時使用的集合是表示在XML無需顯示根。例如,在我們的例子中,我們需要一個接一個,但不是在根節點來顯示每一個節點。讓我們再次修改原來的XStreamTest02例子,將下面的代碼添加到XStreamTest02例子里面
2、執行代碼
3、執行結果
可以看到<phones>被隱藏了
七、XStream屬性混疊
1、屬性混疊用於創建一個成員變量作為XML屬性序列化。讓我們再次修改原來的XStreamTest02例子,將下面的代碼添加到XStreamTest02例子里面
2、執行代碼
3、執行結果
可以看到<name>被作為了<student>的屬性
八、XStream包混疊
1、包混疊用於創建一個類XML的完全限定名稱的別名到一個新的限定名稱。讓我們再次修改原來的XStreamTest02例子,將下面代碼
修改為
2、執行代碼
3、執行結果
可以看到包名由io.github.xstream.test02替換為了xx.xx.xx.xx
九、XStream注解
1、前面的四、五、六、七、八步驟都是通過代碼操作的
2、XStream同時也支持注解,使用注解會變得簡單也會達到相同的效果
3、使用注解的話,需要XML序列化之前添加如下代碼
或者
4、執行結果
使用注解我們也可以看到也能達到相同的效果
注意:當使用XStream對象處理一個被注解的類型時,XStream對象也會處理所有與其相關的類型的注解信息,即該類型的父類、父接口、所有子類的注解。
十、XStream自定義轉換器
1、XStream自帶的轉換器
XStream內部有許多轉換器,用於JavaBean對象到XML或JSON之間的轉換。這些轉換器的詳細信息網址:http://x-stream.github.io/converters.html
2、使用自定義轉換器
自定義轉換器
3、執行結果
4、常用的轉換器接口與抽象類
十一、XStream對象流
1、對象輸出流
2、在指定路徑中打開test.txt文件,查看執行結果
注意:XStream對象流是通過標准java.io.ObjectOutputStream和java.io.ObjectInputStream對象。因為XML文檔只能有一個根節點,必須包裝在一個序列化的所有元素額外的根節點。這個根節點默認為<object-stream>上面的例子所示。
3、對象輸入流
4、執行結果
十二、XStream持久化API
1、保存Java對象
2、運行程序結果,在F磁盤的根路徑可以看到有三個文件:int@0.xml、int@1.xml、int@2.xml,每個對象都被序列化到XML文件里
3、讀取並刪除JavaBean對象
4、運行程序結果,可以看到把F磁盤的根路徑int@0.xml、int@1.xml、int@2.xml文件刪除了
十三、XStream操作JSON
1、XStream序列化JSON的重命名
2、運行結果
注意:XStream序列化JSON的重命名的方式與其序列化成XML的方式一樣!
3、去掉序列化JSON的根節點
4、運行結果
注意:去掉根節點后的JSON串是不能反序列化的,因為XStream不知道它的類型。
5、JSON的解析器區別
前面兩個例子使用了不同的JSON解析器,這里說明他們的不同之處:
-
JettisonMappedXmlDriver:是支持序列化和反序列化Json的。
-
JsonHierarchicalStreamDriver:只支持序列化,不支持反序列化。
參考:
http://x-stream.github.io
https://www.yiibai.com/xstream
https://www.cnblogs.com/LiZhiW/p/4313493.html
● 別在 Java 代碼里亂打日志了,這才是正確的打日志姿勢!
● IDEA 解決 Maven 依賴沖突的高能神器,這一篇夠不夠?
● 你連微服務的網關都說不清楚,還天天鼓搗着要把項目拆分微服務?