My開発メモ

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に伝えることが可能になる。

参考

インターフェースSerializable

カテゴリー: Java, memo

タグ: serialversionuid, シリアルバージョンUID

カウント: 156