serialVersionUIDについて
serialVersionUIDについて
以下のようなクラスを定義したとする。
Fruit.java
public class Fruit implements java.io.Serializable {
private String name;
private int price;
public Fruit() {}
}
これをコンパイルする。
$ javac Fruit.java
serialver とすると、JVMが自動的に付与した serialVersionUID を確認できる。
$ serialver Fruit
Fruit: private static final long serialVersionUID = 7481014788150016266L;
このファイルを以下のように少し改変する。
public class Fruit implements java.io.Serializable {
private int name;
private int price;
public Fruit() {}
}
これをコンパイルすると、
$ javac Fruit.java
$ serialver Fruit
Fruit: private static final long serialVersionUID = 1462501513498895607L;
このように、UIDが変わっている。
で、もとの状態に戻して、コンパイルして、確認すると、
$ serialver Fruit
Fruit: private static final long serialVersionUID = 7481014788150016266L;
もとのUIDに戻っている。
UIDを指定してみる
serialVersionUIDを指定してやってみる。
public class Fruit implements java.io.Serializable {
private static final long serialVersionUID = 123456789L;
private String name;
private int price;
public Fruit() {}
}
コンパイルして確認する。
$ serialver Fruit
Fruit: private static final long serialVersionUID = 123456789L;
改変してみる。
public class Fruit implements java.io.Serializable {
private static final long serialVersionUID = 123456789L;
private int name;
private int price;
public Fruit() {}
}
コンパイルして確認する。
$ serialver Fruit
Fruit: private static final long serialVersionUID = 123456789L;
同じであることがわかる。
要するに
serialVersionUID を記述しておけば、ファイルを改変しても同じ UID になる。
このことにより、クラスをシリアライズして相手に渡したとき、 そのクラスを改変したとしても、 同一のクラスであることをJVMに伝えることが可能になる。
参考
カテゴリー: Java, memo
タグ: serialversionuid, シリアルバージョンUID
カウント: 156