serialVersionUID
フィールドを持っている必要はありません。指定しない場合、Javaはクラスのフィールドとメソッドに基づいて生成します。
指定する理由serialVersionUID
は、メソッドが変更されたときに値が変更されないようにするためです。これは、シリアル化されたバイナリには影響しません。クラスについて考えてみましょう。
public class Person implements Serializable {
private String name;
public String getName() {
return name;
}
}
いいえserialVersionUID
が指定されました。実行すると、次のようserialver Person
になります。
Person: static final long serialVersionUID = 3793453319058452486L;
ここで、メソッドを追加することにしましたが、フィールドは同じままにしておきます。
public class Person implements Serializable {
private String name;
public String getName() {
return name;
}
public Object foo() {
return "bar";
}
}
シリアル化されたバイナリは、古いバージョンと完全に互換性がありますが、serialVersionUID
違いがあります。
Person: static final long serialVersionUID = -6188734029437600310L;
別の場合serialVersionUID
、逆シリアル化すると、serialVersionUIDの不一致エラーが発生します。serialVersionUID
回避策は、任意の値に設定し(私は設定します1L
)、フィールドが変更されるたびに変更することで、独自の宣言を行います。
この関連する質問「serialVersionUIDとは何ですか、なぜそれを使用する必要があるのですか?」も参照してください。より詳細な議論のために。