【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が発生します。
こうやって、古いバージョンのインスタンスが
急に発生したりすることを防げるみたいです。
が、メリットみたいですが、
シリアライズしたことないので、あんまりしっくりこないです。
そもそもシリアライズするのってどういう場面なんだろう...
使う機会があればまた追記します。
Discussion