Serializable
- Javaのインタフェース
- シリアライズできることを宣言できる
- メソッドやフィールドの定義が1つもない(=マーカインタフェース)
宣言をしているだけで機能が追加されるわけでも何でもない
SerialVersionUID
- シリアライズを宣言したクラスのバージョンのようなもの
- IDが同じということは構造が同じであることを保証する
- 構造が変わった時には変更するべきもの
@SuppressWarnings("serial")
- 構造の保証をするためには、SerialVersionUIDのバージョンを適切に運用する必要があるが、そのコストが見合わない場合には下記のアノテーションをつけて回避する
-
implements Serializable
だけしていると下記の警告がでる
警告がでるサンプル
Person.java
package sample;
import java.io.Serializable;
public class Person implements Serializable {
public String name;
public SerializablePerson(String name) {
this.name = name;
}
}
オプション(全ての警告を出すため)をつけてコンパイルすると
javac -Xlint SerializablePerson.java
警告がでる
(Eclipse上では設定によっては表示されない(環境設定->Java->コンパイラー->エラー/警告))
日本語
Serializable.java:5: 警告: [serial] 直列化可能なクラスSerializableには、serialVersionUIDが定義されていません
英語(たぶん)
The serializable class Mutter does not declare a static final serialVersionUID field of type long
アノテーションをつけて実行すると出ません。
Person.java
package sample;
import java.io.Serializable;
@SuppressWarnings("serial")
public class Person implements Serializable {
public String name;
public SerializablePerson(String name) {
this.name = name;
}
}
参考
難解なSerializableという仕様について俺が知っていること、というか俺の理解Add Star
継承することの責任という話がとても為になった