Java中的树结构,用于Android错误

时间:2017-05-20 18:26:52

标签: java android tree gson

我有这个代表树的类......

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class Leitur<T> implements Iterable<Leitur<T>> {

    T data;
    Leitur<T> parent;
    List<Leitur<T>> children;

    public Leitur(T data) {
        this.data = data;
        this.children = new LinkedList<Leitur<T>>();
    }

    public Leitur<T> addChild(T child) {
        Leitur<T> childNode = new Leitur<T>(child);
        childNode.parent = this;
        this.children.add(childNode);
        return childNode;
    }

    @Override
    public Iterator<Leitur<T>> iterator() {
        return null;
    }
}

...

Leitur<String> root = new Leitur<String>("aaa");
Leitur<String> node0 = root.addChild("node0");
Leitur<String> node00 = node0.addChild("node00");
Leitur<String> node000 = node00.addChild(null);
Leitur<String> node1 = root.addChild("node1");
Leitur<String> node10 = node1.addChild("node10");
Leitur<String> node100 = node10.addChild(null);
String text = new Gson().toJson(root);

问题是Gson无法产生预期的文本。不能说明什么。有什么想法吗?

  

AndroidRuntime:FATAL EXCEPTION:main进程:pt.sys.opencvdemo,PID:   13475 java.lang.StackOverflowError:堆栈大小为8MB at   com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:401)   在com.google.gson.stream.JsonWriter.beginArray(JsonWriter.java:287)   在   com.google.gson.internal.bind.CollectionTypeAdapterFactory $ Adapter.write(CollectionTypeAdapterFactory.java:95)   在   com.google.gson.internal.bind.CollectionTypeAdapterFactory $ Adapter.write(CollectionTypeAdapterFactory.java:61)   在com.google.gson.Gson $ FutureTypeAdapter.write(Gson.java:976)at   com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)

1 个答案:

答案 0 :(得分:1)

我想将此问题标记为以下问题的副本,但似乎我不能这样做,因为那个问题没有得到接受。但基本上,解决方案就在那里。

Getting stackoverflowerror from Gson while converting hashmap to JSON object

  

那么我们如何解决这个问题呢?这取决于你想要的行为。一个简单的选择是阻止Gson尝试序列化父字段(我们不需要它,因为我们可以从子列表重建它)。要做到这一点,只需将父标记为瞬态,Gson不会将其包含在结果中。