7月 132012
※憶測入り。特にデシリアライズの時の判断基準とか適当。
結論から言うと、普通は指定しなくて大丈夫。
シリアライズする必要性のあるクラスの場合、指定したほうが環境問題に悩まされずにすむのでベター。
serialVersionUIDとわ
端的にいえば、シリアライズされたオブジェクトを送る側と受け取る側で、どのクラスのインスタンスなのかを識別するためのID。
いろいろ
- どうやらクラス名とクラスメンバとserialVersionUID(以下SUID)で判別してるようだ。
- 送られてきたクラス定義とSUIDが、受け取る側が参照できるクラスと同じなら、互換性があるクラスだと判断して、オブジェクトをそのクラスを使用して解析するんだと思う。
- 定義とSUIDが同じだけど実は互換性がない(実装が違う)場合、変換時に例外が出る。
- 指定しないとSHA-1でクラスのハッシュから計算されるっぽい。
- SUID自動計算の方法は環境によって違うっぽいので自分で指定したほうがベター。
- Serializableインタフェースだと勝手に計算してくれる。
- Externalizableインタフェースだと自分で指定しないとだめぽい。
- Exceptionの場合、ThrowableインタフェースがSerializableインタフェースを実装してるので、SUIDが求められる。
おまけ
serialverコマンドでSUID自動計算の結果が見れる。
ざっと試した感じ、以下の情報できまるっぽい。
- クラス名
- クラスのフィールド(プロパティ、メンバ変数)全部
- private以外のメソッド
実装コードは関係なかった。
まぁシリアライズする必要性のあるクラスにはやはり自分で指定したほうがいいと思う。