java Jackson或Gson以mapKey作为实体对实体进行序列化/反序列化
我的节点类
public class Node<T> {
private T data;
private Node<T> parent;
private HashMap<Node<T>, String> children = new HashMap<>();
}
我的国家班
public class State {
private String name;
private Boolean endState;
}
我的树课
public class Tree<T> {
private Node<T> root;
public Tree() {
}
public Tree(T rootData) {
root = new Node<T>();
root.setData(rootData);
}
public Node<T> getRoot() {
return root;
}
我的主课
public class Main {
public static void main(String[] args) throws IOException {
Tree<State> stateMachine = new Tree<>(new State("q1", false));
Node<State> q2 = new Node<>(new State("q2", true), stateMachine.getRoot());
stateMachine.getRoot().addChild(q2, "a");
stateMachine.getRoot().addChild(stateMachine.getRoot(), "a");
ByteArrayOutputStream os = new ByteArrayOutputStream();
new ObjectMapper().writer().writeValue(os, stateMachine);
String json = os.toString();
os.close();
System.out.println(json);
}
}
我得到的结果是
{
"root":{
"data":{
"name":"q1",
"endState":false
},
"parent":null,
"children":{
"entity.Node@7adf9f5f":"a",
"entity.Node@85ede7b":"a"
}
}
}
我不知道如何避免陷入无限递归,如何完全序列化/反序列化我的对象
# 1 楼答案
根据Json specification,Json字符串中的键必须是字符串。因此,首先,您必须为地图创建自定义序列化程序。当然,你也想要反序列化它,所以你也需要自定义反序列化程序
接下来会出现下一个问题:在反序列化过程中,您希望对同一字符串的所有匹配项使用相同的“key”对象。所以你必须找到已经实例化的密钥。最简单的方法是,如果将所有节点存储在列表中,并使用节点对象本身作为键,则可以使用其在列表中的位置
通过这种方式,键可以是整数的字符串表示,也可以轻松创建自定义反序列化