XStream處理重複的或循環引用

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);



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章