JavaBeans(Serializable - serialVersionUID) | Javaプログラミング初心者のためのページ

JavaBeans(Serializable - serialVersionUID)


JavaBeansの仕様に従うため、Serializableインタフェースを実装してみます。


public class X implements java.io.Serializable{

}


eclipseで上記を記述すると、黄色い警告のアイコンが表示され、
「シリアライズ可能クラス X はlong型のstatic final serialVersionUIDフィールドを宣言していません。」
という警告メッセージが出ます。


Serializableインタフェース自体はマーカーインタフェースなので、定義すべきメソッドはありません。文法的にはフィールドも定義する必要はありません。eclipseでは、ヒントマーク(電球アイコン)も出てくるので、そこから
「デフォルト・シリアル・バージョンIDの追加」や「生成シリアル・バージョンIDの追加」を選択すれば該当するフィールド宣言が追加され、警告マークは消えます。



しかし、この警告メッセージは何なのでしょうか?Serializableインタフェースは「オブジェクトデータをストリーム入出力する(ファイルやネットワークに入出力する)」ためのインタフェースであることを思い出してください。オブジェクトデータを入出力する際、オブジェクトのバージョンを意識する必要が出てきます。例えば、ファイルに出力(シリアライズ)した後、入力(デシリアライズ)するまでの間にクラスに仕様変更があり、フィールドが追加されている可能性があるのです。そこで、オブジェクトのバージョンが分かるように数値を設定しておくことが推奨されます。そのフィールドがserialVersionUIDです。


数値の扱いは自由です。バージョンごとに数値が大きくなったほうが分かりやすいでしょう。long型変数ですので、かなり大きな値でも保持できます。例えば、 private static final long serialVersionUID = 20081225L; などの様に作成時の日付が分かるような値にしてもよいでしょう。



http://www.atmarkit.co.jp/fjava/rensai3/tomcat07/tomcat07.html