2011-11-16 3 views
1

GSon을 사용하여 트리를 직렬화하려고합니다. 이것은 내가 직렬화 할 내 TreeNode의 클래스입니다 :Gson, 트리 구조를 serialize하십시오.

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 적어도 하나의 아이가, 스택 오버 플로우가 발생하고 I있다 이유를 이해하지 못한다. 누군가 내가 뭘 잘못하고 있다고 말할 수 있습니까?

답변

1

부모를 가리키는 부모가 아이를 가리키는 아이가 부모 ...

1

윌 저장하는 무한한 경로가 있는지, 문제는, 권리에 멤버 부모 포인트를 . 부모를 저장하지 않으면이 문제를 해결할 수 있습니다. JSON 객체에서 읽을 때 부모를 설정할 수 있습니다. 부모를 저장하지 않으려면 일시적으로 설정하십시오.

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

POJO로 다시 변환 할 때 아래 setParent-method를 호출합니다.

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); 
     } 
    } 
관련 문제