XStream學習手冊
一、前言
1、XStream官網
//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之間的轉換。這些轉換器的詳細資訊網址://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磁碟的根路徑可以看到有三個文件:[email protected]、[email protected]、[email protected],每個對象都被序列化到XML文件里
3、讀取並刪除JavaBean對象
4、運行程式結果,可以看到把F磁碟的根路徑[email protected]、[email protected]、[email protected]文件刪除了
十三、XStream操作JSON
1、XStream序列化JSON的重命名
2、運行結果
注意:XStream序列化JSON的重命名的方式與其序列化成XML的方式一樣!
3、去掉序列化JSON的根節點
4、運行結果
注意:去掉根節點後的JSON串是不能反序列化的,因為XStream不知道它的類型。
5、JSON的解析器區別
前面兩個例子使用了不同的JSON解析器,這裡說明他們的不同之處:
-
JettisonMappedXmlDriver:是支援序列化和反序列化Json的。
-
JsonHierarchicalStreamDriver:只支援序列化,不支援反序列化。
參考:
//x-stream.github.io
//www.yiibai.com/xstream
//www.cnblogs.com/LiZhiW/p/4313493.html
● 別在 Java 程式碼里亂打日誌了,這才是正確的打日誌姿勢!
● IDEA 解決 Maven 依賴衝突的高能神器,這一篇夠不夠?
● 你連微服務的網關都說不清楚,還天天鼓搗著要把項目拆分微服務?