Gson, сериализовать древовидную структуру - PullRequest
1 голос
/ 17 ноября 2011

Я пытаюсь сериализовать дерево с помощью GSon.Это класс моего TreeNode, который я хочу сериализовать:

public class TreeNode {
private TreeNode parent;
private ArrayList<TreeNode> children;
private Object value;
    //methods
}

И мои вызовы GSon выглядят так:

    TreeNode headNode = getHeadNode();
    Gson gson = new Gson();
    Type typeOfSrc = new TypeToken<TreeNode>(){}.getType();
    String gsonTreeString = gson.toJson(headNode,typeOfSrc);

Как только у headNode появится хотя бы одинребенок, переполнение стека происходит, и я не понимаю, почему.Может кто-нибудь сказать мне, что я делаю не так?

Ответы [ 2 ]

1 голос
/ 08 июня 2015

Воля права, проблема в том, что существует бесконечный путь для сохранения. Вы можете решить эту проблему, не сохраняя родителя. Вы можете установить родителя, когда читаете из JSON-объекта. Чтобы избежать сохранения родителя, просто установите его как временный.

public class TreeNode {
private transient TreeNode parent;
private ArrayList<TreeNode> children;
private Object value;
    //methods
}

При обратном преобразовании в POJO вы вызываете метод setParent ниже.

TreeNode newRoot = gson.fromJson(treeJson, TreeNode.class);
setParents(newRoot);

Метод setParents просто проходит по всем дочерним узлам и устанавливает их родителей в узел, у которого этот узел является дочерним.

private void setParents(TreeNode root) {
        for (TreeNode  node : root.getChildren()) {
            node.setParent(root);
            setParents(node);
        }
    }
1 голос
/ 17 ноября 2011

Родитель-член указывает на своего родителя, у которого есть дочерний элемент, указывающий на дочерний элемент, у которого есть родительский элемент, указывающий на родительский элемент ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...