現象
SerializableなクラスAAAをArrayListに格納してファイル書き出ししようとしたところ、NotSerializableExceptionが発生しました。
(もちろん、AAAのフィールドも全てSerializable)
そのときのコードは次のようなものです。
(コードがアレなのはお許しください。。。)
public class Navigator {
AppCompatActivity activity;
public void navigateToFuga(ArrayList<AAA> list) {
// FugaActivity.createIntent内でIntent生成し
// hogesをファイルに書き出し、ファイルパスをIntentに詰める
activity.startActivity(FugaActivity.createIntent(activity, list));
}
}
public void go() {
navigator.navigateToFuga(new ArrayList<AAA>(){{
add(bbb.aaa);
}});
}
解決方法
コードを次のように書き換えました。
public void go() {
ArrayList<AAA> list = new ArrayList();
list.add(bbb.aaa);
navigator.navigateToFuga(list);
}
あとがき
Activityの画面遷移のためにIntentにデータを詰める、ということはよくやるわけですが
Intentに想定外の大容量データを入れたことでアプリがクラッシュしました。
なので、一時的に上のような方法で対応したのですが、まさかの例外で困りました。
デバッガを見ると、
FugaActivity.createIntent
で受け取ったArrayListのデータ型が HogeActivity$1
のようなものになっていたので、まさかなぁと思って修正した結果うまくいったという次第です。
解決に数時間を要してしまったので、今後は同じ問題に引っかからないようにしないとですね。
NotSerializableExceptionで調べても同じような原因で悩まれている方がいらっしゃらないようだったので記事に書きましたが、なんと調べればよかったんでしょう。。。