2013-01-20 5 views
1

jsonbeans을 기반으로하는 com.badlogic.gdx.utils.Json을 사용하여 json에 개체를 쓰려고 할 때 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) 

이 약 1,024 라인에 대한 계속 :

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로 설정 한 다음 deserialize 직후에 복원 할 수 있습니다. 예 :

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