1

StackOverflowError在尝试将对象写入 json with 时遇到了问题com.badlogic.gdx.utils.Json,这是基于jsonbeans的。除了对 ShapeRenderer 的引用之外,该对象及其引用的所有对象仅包含原始变量,例如 float、boolean、int 等。多个对象都引用同一个 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)

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

4

2 回答 2

1

循环引用是问题所在。这是一个不错的解决方案

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

如果您确实必须保留循环引用,那么我建议您编写自己的解析器,因为在序列化时简单地忽略所有者将意味着在反序列化序列化对象时不会返回所有者。

于 2014-01-10T07:32:41.727 回答
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);
    }
}
于 2016-10-18T20:00:21.300 回答