Джексон или Гсон сериализуют / десериализуют сущность с mapKey в качестве сущности - PullRequest
0 голосов
/ 07 ноября 2018

мой класс Node

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 Ответ

0 голосов
/ 07 ноября 2018

Согласно спецификации Json ключи в строке Json должны быть строками. Итак, в первую очередь вы должны создать собственный сериализатор для вашей карты. Конечно, вы также хотите десериализовать его, поэтому вам также понадобится специальный десериализатор.

Тогда возникнет следующая проблема: во время десериализации вы хотите использовать один и тот же объект «ключ» для всех вхождений одной и той же строки. Таким образом, вы должны найти уже созданные ключи. Самый простой способ, если вы храните все свои узлы в списке и вместо этого используете сам объект узла в качестве ключа, вы можете использовать его положение в списке.

Таким образом, ключи могут быть строковым представлением целых чисел, и вы также можете легко создать собственную десериализацию.

...