Tree Gson,序列化一个树结构

Tree Gson,序列化一个树结构,tree,gson,Tree,Gson,我正在尝试用GSon序列化一棵树。这是我要序列化的TreeNode的类: public class TreeNode { private TreeNode parent; private ArrayList<TreeNode> children; private Object value; //methods } 公共类树节点{ 私有树节点父节点; 私人ArrayList儿童; 私人客体价值; //方法 } 我的GSon电话是这样的: TreeNode headN

我正在尝试用GSon序列化一棵树。这是我要序列化的
TreeNode
的类:

public class TreeNode {
private TreeNode parent;
private ArrayList<TreeNode> children;
private Object value;
    //methods
}
公共类树节点{
私有树节点父节点;
私人ArrayList儿童;
私人客体价值;
//方法
}
我的GSon电话是这样的:

    TreeNode headNode = getHeadNode();
    Gson gson = new Gson();
    Type typeOfSrc = new TypeToken<TreeNode>(){}.getType();
    String gsonTreeString = gson.toJson(headNode,typeOfSrc);
TreeNode headNode=getHeadNode();
Gson Gson=新的Gson();
typeOfSrc=newtypetoken(){}.getType();
字符串gsonTreeString=gson.toJson(headNode,typeOfSrc);

只要
headNode
至少有一个子节点,就会发生堆栈溢出,我不明白为什么。有人能告诉我我做错了什么吗?

成员父级指向其父级,该父级有一个子级指向该子级,而该子级有一个父级指向该父级…

威尔是对的,问题是,要保存的路径是无限的。您可以通过不保存父对象来解决此问题。可以在读取JSON对象时设置父对象。要避免保存父级,只需将其设置为瞬态

公共类树节点{
私有瞬态树节点父代;
私人ArrayList儿童;
私人客体价值;
//方法
}
当转换回POJO时,调用下面的setParent方法

TreeNode newRoot=gson.fromJson(treeJson,TreeNode.class);
setParents(newRoot);
setParents方法只是遍历一个节点的所有子节点,并将它们的父节点设置为将该节点作为子节点的节点

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

在Gson中,您可以创建自定义适配器来序列化表示树的数据结构。您想要的是序列化节点及其所有子节点。这样做的技巧是递归调用
write
方法来填充
JsonWriter
。以下代码适用于您的示例:

公共类TreeNodeAdapter扩展了TypeAdapter{
@凌驾
public void write(JsonWriter JsonWriter,TreeNode节点)引发IOException{
jsonWriter.beginObject()
.名称(“坐标”)
.jsonValue(“\”+node.getValue+“\”)
.姓名(“儿童”)
.beginArray();
//对子节点的递归调用
对于(节点c:Node.getChildren()){
this.write(jsonWriter,c);
}
jsonWriter.endArray()
.endObject();
}
@凌驾
公共节点读取(JsonReader JsonReader)引发IOException{
返回null;
}
}
然后,要使用
treenodedapter
只需安装
NodeTree
,并使用带有自定义适配器的
GsonBuilder
来序列化对象

NodeTree树=新的NodeTree(…);
nodedapter nodedapter=新的nodedapter();
GsonBuilder GsonBuilder=new GsonBuilder().registerTypeAdapter(NodeTree.class,nodeAdapter);
Gson-Gson=gsonBuilder.create();
gson.toJson(树);//JSON字符串