【问题标题】:Jackson or Gson serialize/deserialize entity with mapKey as the entityJackson 或 Gson 以 mapKey 为实体序列化/反序列化实体
【发布时间】:2019-04-10 22:03:26
【问题描述】:

我的节点类

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

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

【问题讨论】:

    标签: java serialization jackson gson deserialization


    【解决方案1】:

    根据 Json specification,Json 字符串中的键必须是字符串。因此,首先您必须为您的地图创建自定义序列化程序。当然你也想反序列化它,所以你也需要自定义反序列化器。

    那么就会出现下一个问题:在反序列化过程中,您希望对所有出现的相同字符串使用相同的“键”对象。所以你必须找到已经实例化的键。最简单的方法是将所有节点存储在一个列表中,而不是使用节点对象本身作为键,您可以使用它在列表中的位置。

    这样键可以是整数的字符串表示,您还可以轻松创建自定义反序列化。

    【讨论】:

    • 我已经尝试创建自己的序列化程序,但我没有设法在第一代节点上停止它,而且在我看来,使用库我没有任何优势,因为到那时我还得自己实现,难道没有某种注解吗?
    • 以包含列表中所有节点的方式重构树。使用节点的位置作为地图中的关键。这样你甚至不需要自定义序列化器/反序列化器。当然你必须使用唯一的 tree.createNode 而不是 new Node()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    相关资源
    最近更新 更多