XStream如何處理重複的或循環引用?
表面上看,它是按照XStream的模式根據XPath節點順序序列化對象,但實際上並不是像想象的那樣,看下面的代碼示例:
1. 創建重複循環對象CircularDesign
package com.favccxx.favsoft.pojo; public class CircularDesign { private String name; private CircularDesign duplicateDesign; public CircularDesign(String name){ this.name = name; } public CircularDesign(String name, CircularDesign duplicateDesign){ this.name = name; this.duplicateDesign = duplicateDesign; } public String getName() { return name; } public void setName(String name) { this.name = name; } public CircularDesign getDuplicateDesign() { return duplicateDesign; } public void setDuplicateDesign(CircularDesign duplicateDesign) { this.duplicateDesign = duplicateDesign; } }
2. 代碼測試
package com.favccxx.favsoft.main; import java.util.ArrayList; import java.util.List; import com.favccxx.favsoft.pojo.CircularDesign; import com.thoughtworks.xstream.XStream; public class SimpleCircularDesign { public static void main(String[] args) { CircularDesign cd = new CircularDesign("circular nodes"); List treeList = new ArrayList(); //添加兩次CircularDesign treeList.add(cd); treeList.add(cd); //添加一次自身對象 treeList.add(treeList); XStream xstream = new XStream(); xstream.alias("duplicateDesign", CircularDesign.class); System.out.println(xstream.toXML(treeList)); } }
3. 輸出結果
<list> <duplicateDesign> <name>circular nodes</name> </duplicateDesign> <duplicateDesign reference="../duplicateDesign"/> <list reference=".."/> </list>
這是XStream根據W3C XPath規範中一個叫做的XPATH_RELATIVE_REFERENCES 默認規則輸出來的內容,這是完全按照人們讀取內容的方式輸出的。
這種輸出方式是因爲 XPath相對模式允許以任意形式的圖文輸出內容,XStream的默認輸出模式如下:
xstream.setMode(XStream.XPATH_RELATIVE_REFERENCES);
4. 如果將XStream的輸出模式改爲絕對路徑模式呢,好像沒有比原來好多少。
xstream.setMode(XStream.XPATH_ABSOLUTE_REFERENCES); <list> <duplicateDesign> <name>circular nodes</name> </duplicateDesign> <duplicateDesign reference="/list/duplicateDesign"/> <list reference="/list"/> </list>
5. XStream還提供了一種ID引用模式,如下所示,不過結果好像並沒有比原來增加多少可讀性。
xstream.setMode(XStream.ID_REFERENCES); <list id="1"> <duplicateDesign id="2"> <name>circular nodes</name> </duplicateDesign> <duplicateDesign reference="2"/> <list reference="1"/> </list>
6. XStream還有單節點相對路徑和單節點絕對路徑模式,輸出效果分別如下,是不是有種上面幾種模式混合加身的效果。然而這有什麼卵用呢,還是一樣的沒有可讀性。
xstream.setMode(XStream.SINGLE_NODE_XPATH_RELATIVE_REFERENCES); <list> <duplicateDesign> <name>circular nodes</name> </duplicateDesign> <duplicateDesign reference="../duplicateDesign[1]"/> <list reference=".."/> </list>
xstream.setMode(XStream.SINGLE_NODE_XPATH_ABSOLUTE_REFERENCES); <list> <duplicateDesign> <name>circular nodes</name> </duplicateDesign> <duplicateDesign reference="/list[1]/duplicateDesign[1]"/> <list reference="/list[1]"/> </list>
7. XStream其實還提供了一種XPath無引用模式,將添加自身引用的代碼去掉,並設置XPath模式即可。
// treeList.add(treeList); xstream.setMode(XStream.NO_REFERENCES);