Libgdx JsonWriter StackOverflowError

时间:2013-01-20 11:34:17

标签: java json libgdx stack-overflow circular-reference

我尝试使用基于jsonbeansStackOverflowError将对象写入json时得到com.badlogic.gdx.utils.Json。该对象及其引用的所有对象仅包含原始变量,如float,boolean,int等,除了对ShapeRenderer的引用。多个对象都引用相同的ShapeRenderer。有一些循环引用(对象都有相互引用),但我认为它应该能够处理它。

造成这些错误的原因是什么?循环引用了问题吗?我不能简单地删除它们而不回到绘图板并重构我的应用程序的主要部分。

Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: java.lang.StackOverflowError
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:111)
Caused by: java.lang.StackOverflowError
    at java.util.regex.Pattern$CharProperty$1.isSatisfiedBy(Unknown Source)
    at java.util.regex.Pattern$7.isSatisfiedBy(Unknown Source)
    at java.util.regex.Pattern$7.isSatisfiedBy(Unknown Source)
    at java.util.regex.Pattern$7.isSatisfiedBy(Unknown Source)
    at java.util.regex.Pattern$7.isSatisfiedBy(Unknown Source)
    at java.util.regex.Pattern$CharProperty.match(Unknown Source)
    at java.util.regex.Pattern$Curly.match0(Unknown Source)
    at java.util.regex.Pattern$Curly.match(Unknown Source)
    at java.util.regex.Pattern$CharProperty.match(Unknown Source)
    at java.util.regex.Matcher.match(Unknown Source)
    at java.util.regex.Matcher.matches(Unknown Source)
    at com.badlogic.gdx.utils.JsonWriter$OutputType.quoteName(JsonWriter.java:174)
    at com.badlogic.gdx.utils.JsonWriter.name(JsonWriter.java:46)
    at com.badlogic.gdx.utils.JsonWriter.set(JsonWriter.java:113)
    at com.badlogic.gdx.utils.Json.writeType(Json.java:574)
    at com.badlogic.gdx.utils.Json.writeObjectStart(Json.java:533)
    at com.badlogic.gdx.utils.Json.writeValue(Json.java:491)
    at com.badlogic.gdx.utils.Json.writeFields(Json.java:237)
    at com.badlogic.gdx.utils.Json.writeValue(Json.java:492)
    at com.badlogic.gdx.utils.Json.writeFields(Json.java:237)
    at com.badlogic.gdx.utils.Json.writeValue(Json.java:492)
    at com.badlogic.gdx.utils.Json.writeFields(Json.java:237)
    at com.badlogic.gdx.utils.Json.writeValue(Json.java:492)
    at com.badlogic.gdx.utils.Json.writeFields(Json.java:237)

大约有1024行:

    at com.badlogic.gdx.utils.Json.writeValue(Json.java:492)
    at com.badlogic.gdx.utils.Json.writeFields(Json.java:237)

不确定这是日志限制还是堆栈限制,我想是第一个。

2 个答案:

答案 0 :(得分:1)

循环引用是问题所在。这是一个不错的Solution

  

我认为解决这个问题的最佳方法是,可能会删除你的   通过以某种方式重新构建数据结构的循环链接,   也许使用某种地图或表来链接实体   物品。

     

如果你真的必须保留循环引用,那么我建议   编写自己的解析器只是忽略序列化的所有者   将意味着序列化对象时不返回所有者   反序列化。

答案 1 :(得分:0)

在某些情况下,您也可以在序列化之前将这些引用设置为null,然后在反序列化后立即恢复它们。例如:

class Parent {
    Array<Son> sons;

    public void serialize() {
       clearParents();
       ... serialization code ...
       restoreParents();
    }

    public static Parent deserialize(data) {
        Parent parent = ... deserialization code ...
        parent.restoreParents();
        return parent;
    }

    public void clearParents() {
        for (Son son :sons) {
            son.parent = null;
        }
    }

    public void restoreParents() {
        for (Son son :sons) {
            son.parent = this;
        }
    }

}

class Son {
    Parent parent;

    public Son (Parent parent) {
        this.parent = parent;
        parent.sons.add(this);
    }
}