今回は、JavaのシリアルバージョンUIDについて調べたことを簡単にまとめておこうと思います。
シリアルバージョンUIDは、シリアライズが関係してきますが、そもそもシリアライズって何?という方は別の記事でまとめていますのでよろしければお読みください。
Javaのシリアライズについて - ITエンジニアの成長ブログ
シリアルバージョンUIDとは?
あるクラスのインスタンスをファイルなどにシリアライズしてから、デシリアライズをする場合は通常はタイムラグがあると思います。
その場合に、たとえばあるクラスAのインスタンスをシリアライズしておいて、後日デシリアライズしようとしたときにクラスAの定義が変わっている場合に、デシリアライズ後のなんらか処理でクラスAの定義変更による想定外のエラーが発生する可能性があるかもしれません。
そのような事態を防ぐために、シリアライズしたときと、デシリアライズしたときのクラスの構造の違いを区別するためにシリアルバージョンUIDと呼ばれる値が使われます。
このシリアルバージョンUIDと呼ばれる値をクラス定義が変わったタイミングで合わせて変更することで、もし定義が変わっていたら気づくことができるようになります。後で問題が発生する前に、事前にデシリアライズのタイミングで気づくようにする仕掛けということですね。
もし、シリアルバージョンUIDが異なった場合は例外(InvalidClassException)が発生します。
ちなみに、この値を定義しなくても普通にコンパイルして動かすことができるため、そこらへんはプログラムを書くユーザー側に一任されています。
あと、シリアルバージョンUIDを具体的にどのように定義するかというと、Serializableインタフェースを実装しているクラスに以下のように定義します。
EclipseでシリアルバージョンUIDの警告が出力されない??
これは蛇足ですが、最近のEclipseではSerializableインタフェースを実装しているクラスにserialVersionUIDを定義しなくても警告が出力されないようなっているようです。
調べ方ですが、Eclipseのパッケージエクスプローラで該当のプロジェクトを右クリックし、「プロパティ」-「Javaコンパイラー」-「エラー/警告」で、潜在的なプログラミングの問題欄に"serialVersionUIDなしのシリアライズ可能クラス"の設定があります。「無視」になっていますね。
おわりに
いかがでしたでしょうか。シリアルバージョンUID、いつも何となく定義している方もいるかもしれませんがこの記事をみて、その意味を知っておくといつか役にたつかもしれません。
最後までお読みいただきありがとうございました。今回はこの辺で失礼いたします。