70393


FragmentのonSaveInstanceStateでの保存処理がうまくいかずに困っています。  
独自実装しているクラスAを保存したいのです。独自クラスAは、独自クラスBを要素に持つArrayListの変数を持っています。  
A、B共にSerializableを継承していますが、

[code]

    Parcelable encountered IOException writing serializable object
    
[/code]

というエラーが出てしまいます。コードは以下で、開発者オプションのアクティビティ破棄を有効にして動作確認をしています。

[code]

    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState){
        outState.putSerializable("TEST", new TestA());
        super.onSaveInstanceState(outState);
    }
    
    class TestA implements Serializable{
        private ArrayList<TestB> mTestB;
    
        public TestA(){
            ArrayList<TestB> testB = new ArrayList<>();
            testB.add(new TestB());
            mTestB = testB;
        }
    }
    
    class TestB implements Serializable{
        public TestB(){}
    }
    
[/code]


CC BY-SA 4.0
2020-09-14T05:18:36.510
70375
2020-09-14T22:21:47.790
2020-09-14T22:21:47.790
32986
19027
question
java android
Bundleでのデータ保持について


`TestA`, `TestB`クラスをFragment派生クラスの **インナークラス** として定義していたりしないですか？

Javaのインナークラス（ネストされた非staticクラス）は、外側のクラスインスタンスへの参照を暗黙的にキャプチャし、フィールドとして保持します。これにより、あたかも外側のクラスのインスタンスメンバーに直接アクセスしているかのような記述が可能となりますが、これはC++やC#におけるネストされたクラスとは大きく異なり、Java初心者がつまづきやすいポイントです。

したがって、通例`java.io.Serializable`を実装するクラスは、ネストされていない最外クラス、またはstaticクラスにする必要があります。  
詳しくは以下を参照してください。

  * [Android SDKの，ParcelableとSerializableの違いを比較 - Intentで独自オブジェクトを運搬する際，役立つのはどちら？ - 主に言語とシステム開発に関して](https://language-and-engineering.hatenablog.jp/entry/20120313/p1)


CC BY-SA 4.0
2020-09-14T19:56:59.910
70393
2020-09-14T19:56:59.910
15413
70375
answer