1

jsonbeansに基づくStackOverflowErrorオブジェクトをjsonに書き込もうとすると、が発生します。オブジェクトとそれが参照するすべてのオブジェクトには、ShapeRendererへの参照を除いて、float、boolean、intなどのプリミティブ変数のみが含まれます。複数のオブジェクトはすべて同じShapeRendererを参照します。いくつかの循環参照(両方が相互に参照しているオブジェクト)がありますが、それを処理できるはずだと思います。com.badlogic.gdx.utils.Json

これらのエラーの原因は何でしょうか?循環参照は問題ですか?製図板に戻ってアプリの主要部分を再構築せずに、それらを単純に削除することはできません。

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 に答える