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"
}
}
}

我不知道如何避免陷入无限递归,并完全序列化/反序列化我的对象。

根据Json规范,Json字符串中的键必须是Strings。因此,首先必须为映射创建自定义序列化程序。当然,您还想反序列化它,所以您也需要自定义反序列化程序。

然后会出现下一个问题:在反序列化过程中,您希望对相同String的所有出现使用相同的"key"对象。因此,您必须找到已经实例化的键。最简单的方法是,如果将所有节点存储在列表中,并将节点对象本身用作关键点,则可以使用其在列表中的位置。

通过这种方式,键可以是Integers的字符串表示,您还可以轻松地创建自定义反序列化。

最新更新