2013年6月10日月曜日

AndroidでSerializableなクラスを継承したクラスの落とし穴

なんかよくわからんタイトルになってしまいましたが、Serializableなクラスを継承したクラスはSerializableをimplementsしなくてもSerializeすることができます。

public class S implements Serializable {
  private static final long serialVersionUID = 6105608118246672383L;
}

public class Hoge extends S {
  //serialVersionUIDなし、SをextendsしてるのでSerializeはできる
}

ところがこの継承したクラスはserialVersionUIDがないため、コンパイラが自動生成したserialVersionUIDを与えてしまうのです。
そうなると継承クラスをちょっと変えようものなら、変更前にSerializableしたファイルはserialVersionUIDが違うためInvalidClassExceptionを起こしてしまいます。
そうならないために、serialVersionUIDをきちんとつける習慣をつけましょう。
Serializableは拍子抜けするほど簡単にクラスをファイルに落とすことが出来て大変便利なんですが、適当に使うと大変な目にあいますね。
後々の変更も検討してよく考えて使いましょう。この辺もよく読んでおくといいかも。

Serializationの実装
http://book.geocities.jp/bits_of_java/java/io/serializable/index.html#contents

Java セキュアコーディングスタンダード CERT/Oracle 版 シリアライズ (SER)
https://www.jpcert.or.jp/java-rules/#c13

0 件のコメント:

コメントを投稿