Tree Gson,序列化一个树结构
我正在尝试用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
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字符串