2011-11-16 118 views
1

我想用GSon序列化一棵樹。這是類我TreeNode我想序列:Gson,序列化樹結構

public class TreeNode { 
private TreeNode parent; 
private ArrayList<TreeNode> children; 
private Object value; 
    //methods 
} 

而且我GSON調用看起來是這樣的:

TreeNode headNode = getHeadNode(); 
    Gson gson = new Gson(); 
    Type typeOfSrc = new TypeToken<TreeNode>(){}.getType(); 
    String gsonTreeString = gson.toJson(headNode,typeOfSrc); 

一旦該headNode有至少一個孩子,發生堆棧溢出,我不明白爲什麼。有人能告訴我我做錯了什麼嗎?

回答

1

成員父指向其父具有指向具有指向父父孩子一個孩子......

1

威爾是正確的,問題是,有保存無限路徑。您可以通過不保存父項來解決此問題。您可以在從JSON對象讀取時設置父級。爲了避免保存父母,只需將其設置爲暫時。

public class TreeNode { 
private transient TreeNode parent; 
private ArrayList<TreeNode> children; 
private Object value; 
    //methods 
} 

當轉換回POJO時,您可以調用下面的setParent方法。

TreeNode newRoot = gson.fromJson(treeJson, TreeNode.class); 
setParents(newRoot); 

的setParents法只是經過一個節點的所有孩子,並將他們的父母到具有節點的子節點。

private void setParents(TreeNode root) { 
     for (TreeNode node : root.getChildren()) { 
      node.setParent(root); 
      setParents(node); 
     } 
    }