2013-08-05 2 views
0

내 앱이 멀리 떨어져 전환되어 일시 중지되면 상태를 유지하는 데 문제가 있습니다. onSaveInstanceState 및 onRestoreInstanceState 메서드를 오버로드하여 내 응용 프로그램 상태 (배열, arraylists, 해시 집합, 열거 형 및 프리미티브로 구성된)에 중요한 변수가 포함 된 유일한 개체를 저장하고 복원합니다. 불행히도, 내 응용 프로그램에서 전환하면 직렬화 오류로 인해 충돌이 발생합니다.객체의 직렬화로 인해 Android에서 RuntimeException이 발생합니다.

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    // Next line causes error when switching apps, but not when rotating screen 
    savedInstanceState.putSerializable("board", board); 
} 
@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    board = (Board)savedInstanceState.getSerializable("board"); 
} 

지금까지 내가 말할 수있는, 내 유일한 문제는 내가 만든 보드 객체 직렬화되지 않는 것입니다 : 여기에 상태를 저장 및 복원을 위해 내가 가지고있는 코드입니다. 그러나 Serializable을 구현하고 serialVersionUID를 정의하므로 serializable을 만들기 위해 더 많은 작업을 수행해야하는지 알 수 없습니다. 일반적으로 그게 전부입니다.

  1. 가 getSerializable 방법보다 객체의 인스턴스를 저장하고 검색 할 수있는 더 나은 방법이 있나요 :
    나는이 개 질문이?
  2. 런타임 예외를 발생시키지 않고 개체를 serialize하려면 어떻게해야합니까? 내 객체가 화면 회전 문제없이 직렬화 보이지만 앱을 바꿔 치기 할 때 오류가 발생하기 때문에

것은 나는이 예외는 특히 홀수 찾을 수 있습니다. 관련성있는 경우에 대비하여 스택 추적을 아래에 포함했습니다. 내가 요청한 경우 문제의 게시판 (게시판)에서 코드를 게시 할 수도 있습니다. 미리 제안 해 주셔서 감사합니다. drurenia 자신의 의견에서 지적

08-05 18:10:32.322 32059-32059/? E/AndroidRuntime: FATAL EXCEPTION: main 
    java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.example.android.Board) 
    at android.os.Parcel.writeSerializable(Parcel.java:1279) 
    at android.os.Parcel.writeValue(Parcel.java:1233) 
    at android.os.Parcel.writeMapInternal(Parcel.java:591) 
    at android.os.Bundle.writeToParcel(Bundle.java:1627) 
    at android.os.Parcel.writeBundle(Parcel.java:605) 
    at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2252) 
    at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3179) 
    at android.os.Handler.handleCallback(Handler.java:725) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:5226) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
    at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.io.NotSerializableException: com.example.android.Square 
    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364) 
    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) 
    at java.io.ObjectOutputStream.writeNewArray(ObjectOutputStream.java:1205) 
    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1662) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) 
    at java.io.ObjectOutputStream.writeNewArray(ObjectOutputStream.java:1205) 
    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1662) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) 
    at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979) 
    at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368) 
    at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074) 
    at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404) 
    at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) 
    at android.os.Parcel.writeSerializable(Parcel.java:1274) 
    ... 15 more 
+1

바보 같은 질문, 당신이 클래스를 직렬화 해주었습니다 *** com.example.android.Square ***? –

+0

좋은 질문입니다. 나는 그것이 필요하다는 것을 깨닫지 못했다. 거대한 스택 추적에서 그 라인을 알아 채지 못했습니다. 그건 내 잘못을 변경; 이제는 HashSet이 StackOverflowError를 일으키는 것처럼 보입니다. 당신의 도움을 주셔서 감사합니다! –

답변

-1

, 나는 내 보드 클래스에 포함 된 멤버 중 하나였다 내 광장 클래스에 implements Serializable를 추가 할 필요가 있었다.
두 번째 문제는 Square에 순환 참조로 인해 발생했습니다. 각 Square에는 각각의 이웃에 대한 참조가 포함되어 있기 때문입니다. Board 클래스 내에 readObjectwriteObject을 구현하면 해결할 수 있습니다. 직렬화 중에 순환 참조를 처리하는 방법에 대한 자세한 내용은 in this answer을 참조하십시오.

+1

둘째 문제는 순환 참조 때문이 아닙니다. 직렬화는 이미 순환 참조를 올바르게 처리하고 있으며 순환 참조에 대해 언급 한 답변에는 아무 것도 없습니다. 당신이 한 일과, 당신이 인용 한 대답이 스택 오버플로 문제를 해결합니다. – EJP

+0

아마도 '순환 참조'는 잘못된 용어입니다. 내 Square 클래스가 다른 Square 객체에 대한 참조를 포함한다는 사실이 그 원인이었습니다. 이것은 직렬화 중에 스택 오버플로를 일으키므로 기본 구현에서 무한 재귀를 피하기 위해 수동으로 writeObject를 추가해야했습니다. 내가 제공 한 링크에있는 Paŭlo Ebermann의 설명은 기본 구현에서 재귀가 객체가 자체 유형을 참조한다는 사실 때문에 스택 오버플로가 발생하는 방식을 설명합니다. –

관련 문제