java:シリアルバージョンUIDの用途

実務で使用するjavaには、シリアルバージョンUIDが使われていることが良くあります。
シリアルバージョンUIDを知らなくともテストが通ってしまうことが多いと思うのですが、それだと思わぬ失敗をしかねないので、今回の記事で紹介したいと思います。

【シリアルバージョンUIDの用途】

javaではインスタンスをバイナリファイルとして保存することができます。
しかし、インスタンスのクラスの設計を変更した場合、前の設計のバイナリファイルを読み込むと、現在の設計のクラスとの整合性が取れずに処理結果が不正になる恐れがあります。

その際に、クラスにシリアルバージョンUIDを定義しておくことで、前の設計のバイナリファイルを読み込んだ際に例外を吐き出すことができるようになります。
シリアルバージョンUIDはバイナリファイルに保存されるのですが、現在のクラスのシリアルバージョンUIDとバイナリファイルのシリアルバージョンUIDが異なる場合に例外として判定されます。
そのため、クラスの設計を変更する度にシリアルバージョンUIDを変更していれば、前の設計のバイナリファイルを読み込んだ際に例外となります。

【テストコード】

以下、実際に挙動を確認した結果です。

■Item.java

■MainInput.java

■MainOutput.java

【実行結果】

■当初のクラス設計(①を有効、②をコメントアウト)

・MainInputを実行

インスタンスがファイルとして保存される。

・MainOutputを実行

インスタンスを読み込めていることを確認できる。

■クラス設計変更(①をコメントアウト、②を有効)

・MainOutputを実行(変更前のクラス設計時のファイルを読み込んでみる)

インスタンス内に保存されたシリアルバージョンUIDが現在のクラスのシリアルバージョンUIDと異なるため、現在のクラスに対応したインスタンスではないと判断して異常終了する。
(シリアルバージョンUIDを変更しないと、現在のクラスに対応したインスタンスでなくても読み込み時にエラーにならずに後続に進んでしまう。不正なインスタンスを用いることで後続処理の処理結果が不正になる可能性が出てしまう。)

・MainInputを実行→MainOutputを実行

新しいクラスでインスタンスを作り直せば正常に処理できる。


今回取り扱ったシリアルバージョンUIDもそうですが、研修で習うことは少なくても実務での使用頻度は高い、という文法は少なくありません。
そのような文法を見つけたら、また紹介したいと思います。

これからも、実務で役に立つ情報をお伝えできればと思います。
では、また来週!

カテゴリーjava

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA