Serializableの注意点と対策

Javaに搭載されているオブジェクトの直列化機能のSerializableは、大変便利なのだが注意すべき点が沢山ある。

  • クラスをSerializableにするときは、その基底クラスもSerializableにする。基底クラスがSerializableになってないかつデフォルトコンストラクタが無いとInvalidClassExceptionが発生する。
  • メンバもSerializableにする。
  • メンバを後から増やした時、Serializableオブジェクトを復元したときはそのメンバにはデフォルト値が入る。
  • serialVersionUIDを設定しよう。設定しないとそのSerializableクラスのハッシュから計算されるのだが、そうするとメソッドを追加しただけで以前のクラスで出力したものと互換性が無くなりInvalidClassExceptionが発生する。

所感

  • 後からRMI化しなければならなくなったとき等のために可能な限りはじめからSerializableにしておくと良さげ。
  • Serializableじゃないスーパークラスを継承したSerializableなクラスはコンパイル時にエラー(せめて警告)出しても良いと思う。基底クラスの変数が引き継がれないような使い方をする人なんてほとんど居ないんじゃないかな。
  • SerializableなクラスのフィールドにSerializableじゃないフィールドがいる時もコンパイル時エラーか警告で良いと思う。(Externalizableなどの場合は例外として)