【JAVA】シリアライズとは? SerialVersionUIDの作り方

2025/01/25に公開
private static final long serialVersionUID = -2170800526658571029L;

こんなやつです。
Serializableインターフェースを実装している場合に、
このIDが付与されてます。

作り方だけ知りたい

手動で作成したりはしません。
IDEで自動生成します。

Eclipseでの設定方法

https://itsakura.com/eclipse-java-serializable

上記記事が参考になります。

VSCodeでの設定方法

ちょっと面倒くさいです。
以下が手順になります。

①.settingsフォルダを表示する
②シリアルバージョンUIDがない時にWARNINGが出るように設定する
③WARNINGからSerialVersionUIDを設定する

①.settingsフォルダを表示する

※ JAVAプロジェクト内に既に.settingsフォルダが表示されている方は、
この手順をスキップしてください。

  • まず、コマンドパレットを開きます。

  • コマンドパレットで、"open Settings"と検索して、Preferences: Open Settings JSONを選択してください。

  • 選択すると、だいたい以下のようなファイルが開きます。 この中の、"files.exclude"が非表示になっているファイルです。 ここに、8行目の"**/.settings"が含まれています。 ここのtrueをfalseに変えます。

  • trueをfalseに変えました。

  • 一旦、VSCodeを再起動します。

これでステップ①は終了です。

②シリアルバージョンUIDがない時にWARNINGが出るように設定する

  • ①の設定で、JAVAプロジェクト内に".settings"フォルダが表示されるようになったので、.settingsフォルダを開きます。(アプリケーションのroot直下にあります!)

  • .settingsフォルダ内の"org.eclipse.jdt.core.prefs"ファイル(上画像だと3つ目)を開きます。だいたい以下のような感じになってます。

  • "org.eclipse.jdt.core.prefs"ファイル内に、以下設定を書き込みます。
org.eclipse.jdt.core.compiler.problem.missingSerialVersion=obey

(12行目に追加されてます。)

  • 保存して、また再起動します。

③WARNINGからSerialVersionUIDを設定する

こっから先は楽勝ですね!

  • シリアライズしたいクラスを開きます。

  • クラスにSerializableインターフェースを実装させます。

  • すると、クラス名の部分にWARNINGが出るので、カーソルを当ててWARNINGを見てみます。

  • SerialVersionUIDないよって言われてますね!なので、Quick Fixで"Add generated serial version ID"をクリックします。

  • serialVersionUIDが設定されます。

SerialVersionUIDが設定できました!
お疲れ様でした。

そもそもSerializableってなんなのか

Serializableというインターフェースです。このインターフェースは、中身はなく実装とかもない「マーカーインターフェース」なるものです。

このインターフェースを実装してます宣言(implements Serializable)することで、**シリアライズできるクラスです!**って示しているらしいです。

シリアライズとかデシリアライズとか結局どういうこと

シリアライズ
JAVAオブジェクトをバイト配列に変換すること

デシリアライズ
バイト配列をJAVAオブジェクトに変換すること

らしいです。
バイト配列とか言われても.....わかりづらい.......

「バイト配列」っていうのは、「バイナリデータ」とかと一緒のもので、コンピュータが理解しやすいデータらしいです。

らしいです。バイト配列とか言われても.....わかりづらい.......「バイト配列」っていうのは、「バイナリデータ」とかと一緒のもので、コンピュータが理解しやすいデータらしいです。

つまり、バイト配列に変換すること=コンピュータが理解しやすいデータに変換することらしいですが、
つまりは、JAVAで扱っているオブジェクトをJVMから出して
外の世界(コンピュータとか)でも使えるデータにできるってことみたいです。

シリアライズ
JAVAのインスタンス情報を外部に出力すること

デシリアライズ
外部にあるインスタンス情報をJAVAインスタンスに変換すること

てことになります。

SerialVersionUIDの必要性とメリット

このSerialVersionUIDは、クラスに対して「修正」をする度に新しいIDを付与する必要があります。

(「修正」の定義はプロジェクトによるんでしょうか、1文字でも修正したら変えるのか、フィールドを修正したら変えるのか、とかは不明です。)

そうすると、クラスのバージョン管理ができるようになります。

例えば、最初に作ったクラスに1LのSerialVersionUIDを付与したとしてそのクラスをインスタンス化して、シリアライズしたとします。

この後、クラスを修正して2LのSerialVersionUIDを付与したとします。

1Lのときにシリアライズしたインスタンス情報データをデシリアライズ(JAVAオブジェクトに復活)しようとすると、InvalidClassExceptionが発生します。

こうやって、古いバージョンのインスタンスが
急に発生したりすることを防げるみたいです。

が、メリットみたいですが、
シリアライズしたことないので、あんまりしっくりこないです。

そもそもシリアライズするのってどういう場面なんだろう...
使う機会があればまた追記します。

GitHubで編集を提案

Discussion