ITエンジニアの成長ブログ

ITエンジニアとして行う勉強の発信&日々の生活で体験した楽しいことをゆるく発信

JavaのシリアルバージョンUIDとは?

今回は、JavaのシリアルバージョンUIDについて調べたことを簡単にまとめておこうと思います。

シリアルバージョンUIDは、シリアライズが関係してきますが、そもそもシリアライズって何?という方は別の記事でまとめていますのでよろしければお読みください。
Javaのシリアライズについて - ITエンジニアの成長ブログ

シリアルバージョンUIDとは?

あるクラスのインスタンスをファイルなどにシリアライズしてから、デシリアライズをする場合は通常はタイムラグがあると思います。

その場合に、たとえばあるクラスAのインスタンスシリアライズしておいて、後日デシリアライズしようとしたときにクラスAの定義が変わっている場合に、デシリアライズ後のなんらか処理でクラスAの定義変更による想定外のエラーが発生する可能性があるかもしれません。

そのような事態を防ぐために、シリアライズしたときと、デシリアライズしたときのクラスの構造の違いを区別するためにシリアルバージョンUIDと呼ばれる値が使われます。

このシリアルバージョンUIDと呼ばれる値をクラス定義が変わったタイミングで合わせて変更することで、もし定義が変わっていたら気づくことができるようになります。後で問題が発生する前に、事前にデシリアライズのタイミングで気づくようにする仕掛けということですね。

もし、シリアルバージョンUIDが異なった場合は例外(InvalidClassException)が発生します。
ちなみに、この値を定義しなくても普通にコンパイルして動かすことができるため、そこらへんはプログラムを書くユーザー側に一任されています。

あと、シリアルバージョンUIDを具体的にどのように定義するかというと、Serializableインタフェースを実装しているクラスに以下のように定義します。

f:id:mr_star:20211005192757p:plain
シリアルバージョンUIDサンプル

EclipseでシリアルバージョンUIDの警告が出力されない??

これは蛇足ですが、最近のEclipseではSerializableインタフェースを実装しているクラスにserialVersionUIDを定義しなくても警告が出力されないようなっているようです。

調べ方ですが、Eclipseのパッケージエクスプローラで該当のプロジェクトを右クリックし、「プロパティ」-「Javaコンパイラー」-「エラー/警告」で、潜在的なプログラミングの問題欄に"serialVersionUIDなしのシリアライズ可能クラス"の設定があります。「無視」になっていますね。

f:id:mr_star:20211005191527p:plain
EclipseのSerialVersionUIDの警告エラーの設定

おわりに

いかがでしたでしょうか。シリアルバージョンUID、いつも何となく定義している方もいるかもしれませんがこの記事をみて、その意味を知っておくといつか役にたつかもしれません。

最後までお読みいただきありがとうございました。今回はこの辺で失礼いたします。