インスタンスイ二シャライザで初期化したMapのシリアライズでエラー
インスタンスイ二シャライザを使って初期化したMapをRMIで送付しようとしたらエラーになった。問題のMapの初期化コードは以下。
RMIObject rmiobject = new RMIObject(); rmiobject.setMap(new HashMap<String, String>(){{ put( "a", "aaa" ); put( "b", "bbb" ); put( "c", "ccc" ); }});
原因
上の場合、HashMap派生の無名クラスを作成して、そのインスタンスイ二シャライザで初期化を行なっている。このとき、作成されたMapはエンクロージングインスタンスの参照を持つため、こいつがSerializableじゃないよー、となってエラーになってしまう。
そうか、そういう罠があるのかー。
対策
- Mapなら移し替えてやるのが簡単かなー。
- 若干、謎っぽいコードだけどこれくらいなら許されるよね。きっと。テストケースだし!
RMIObject rmiobject = new RMIObject(); // インスタンスイニシャライザで初期化したMapをそのままセットするとシリアライズできないので、 // 普通のMapに移し替えてからセットする。 rmiobject.setMap( new HashMap<String, String>( new HashMap<String, String>(){{ put( "a", "aaa" ); put( "b", "bbb" ); put( "c", "ccc" ); }}));