2013-01-20 13 views
1

当试图将对象写入json com.badlogic.gdx.utils.Json(基于jsonbeans)时,我得到StackOverflowError。除了对ShapeRenderer的引用外,它引用的对象和所有对象只包含像float,boolean,int等基本变量。多个对象都引用相同的ShapeRenderer。有一些循环引用(对象都相互引用),但我认为它应该能够处理。Libgdx JsonWriter StackOverflowError

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

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) 

不知道这是否是日志限制或堆栈限制,我想第一个。

+0

你可以试着将你想写入的值修剪成一个小例子吗?您可能能够找出具体问题。我怀疑一个循环引用的小例子将揭露这个问题... –

+0

我删除了所有循环引用和对ShapeRenderer的所有引用。我将shaperenderer传递给需要渲染每个帧的对象的渲染函数,以及需要时用于直接从父对象获取的其他一些变量。现在JSON作家和读者工作,但我仍然不知道为什么它不会很好地循环引用。它不会很难被发现,只需存储每个唯一实例的一个副本,并通过ID引用其余的实例... – Hatagashira

回答

1

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

我认为,解决这是最好的办法,就是可能通过重新architeching你的数据结构以某种方式删除您 循环链接, 也许使用某种图或表而是将实体链接到 该物品。

如果你真的必须保持循环引用,那么我建议 编写自己的解析器根本无视系列化 业主将意味着车主在序列化对象是 反序列化没有回来。

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); 
    } 
}