2011-11-16 119 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); 
     } 
    }