【JAVA】シリアライズとは? SerialVersionUIDの作り方
private static final long serialVersionUID = -2170800526658571029L;
こんなやつです。
Serializableインターフェースを実装している場合に、
このIDが付与されてます。
作り方だけ知りたい
手動で作成したりはしません。
IDEで自動生成します。
Eclipseでの設定方法
上記記事が参考になります。
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が発生します。
こうやって、古いバージョンのインスタンスが
急に発生したりすることを防げるみたいです。
が、メリットみたいですが、
シリアライズしたことないので、あんまりしっくりこないです。
そもそもシリアライズするのってどういう場面なんだろう...
使う機会があればまた追記します。
この記事が気に入ったらサポートをしてみませんか?