0

アプリからの切り替えが原因で一時停止したときに、アプリの状態を保持するのに問題があります。onSaveInstanceState メソッドと onRestoreInstanceState メソッドをオーバーロードして、アプリケーションの状態にとって重要な変数 (多数の配列、配列リスト、ハッシュセット、列挙、およびプリミティブで構成される) を含む唯一のオブジェクトを保存および復元しました。残念ながら、アプリから切り替えると、シリアライゼーション エラーでアプリがクラッシュします。状態を保存して復元するためのコードは次のとおりです。

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

私の知る限り、私の唯一の問題は、私が作成した Board オブジェクトがシリアル化できないことです。ただし、Serializable を実装し、serialVersionUID を定義しているため、シリアル化可能にするためにさらに何をする必要があるかわかりません。通常はそれだけで十分です。
2 つの質問があります。

  1. getSerializable メソッドよりもオブジェクトのインスタンスを保存および取得するためのより良い方法はありますか?
  2. 実行時例外をスローせずにオブジェクトをシリアル化するにはどうすればよいですか?

画面を回転させるとオブジェクトが問題なくシリアル化されるように見えますが、アプリを切り替えるとエラーが発生するため、この例外は特に奇妙です。関連する場合に備えて、以下にスタック トレースを含めました。リクエストがあれば、問題のオブジェクト (ボード) からコードを投稿することもできます。提案をお寄せいただきありがとうございます!

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
4

1 に答える 1

-1

Drurenia がコメントで指摘したようimplements Serializableに、Board クラスに含まれるメンバーの 1 つである Square クラスに追加する必要がありました。
2 つ目の問題は、Square クラスの循環参照が原因でした。これは、各 Square に隣接するそれぞれへの参照が含まれているためです。readObjectBoardクラスを実装してwriteObject内部で解決できるはずです。シリアル化中の循環参照の処理の詳細については、この回答を参照してください。

于 2013-08-06T00:51:17.233 に答える