見出し画像

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

private static final long serialVersionUID = -2170800526658571029L;

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

作り方だけ知りたい

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

Eclipseでの設定方法

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

VSCodeでの設定方法

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

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

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

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

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

画像1

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

画像2

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

画像3

・trueをfalseに変えました。

画像4

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

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

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

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

画像5

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

画像6

・"org.eclipse.jdt.core.prefs"ファイル内に、以下設定を書き込みます。

org.eclipse.jdt.core.compiler.problem.missingSerialVersion=obey

画像7

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

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

③WARNINGからSerialVersionUIDを設定する

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

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

画像8

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

画像9

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

画像10

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

画像11

・serialVersionUIDが設定されます。

画像12

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


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

Serializableというインターフェースです。
このインターフェースは、中身はなく実装とかもない「マーカーインターフェース」なるものです。
このインターフェースを実装してます宣言(implements Serializable)することで、「シリアライズできるクラスです!」って示しているらしいです。

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

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

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

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

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

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

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

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

てことになります。

SerialVersionUIDの必要性とメリット

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

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

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

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

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

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

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

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

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

この記事が気に入ったらサポートをしてみませんか?