読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

インスタンスイ二シャライザで初期化したMapのシリアライズでエラー

Java

インスタンスイ二シャライザを使って初期化した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" );
}}));
  • 他のオブジェクト(独自に定義したモデルクラスなど)はいい手が思いつかない・・。移し替え用のAPIを用意するか、インスタンスイ二シャライザを使わずに普通に初期化するしかないかな。