天天看點

JAVA中,對象的序列化與serialVersionUID

隻有可序列化(Serializable)的對象,才可以被檔案存儲或網絡傳輸。

要想讓對象可序列化,隻需讓它實作序列化接口(implements java.io.Serializable)即可!

而無需重載Serializable的任何方法,它也沒方法可被重載:

public interface Serializable {
}
           

與之類似的,還有個可外部化(Externalizable),其有如下兩個方法必須實作(implements):

public interface Externalizable extends java.io.Serializable {
void writeExternal(ObjectOutput out) throws IOException;
void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
}
           

數值型的封裝類(Byte,Short,Integer,Long,Float,Double等)繼承自Number,它實作了序列化接口。

布爾型的封裝類(Boolean),字元的封裝類(Character)和字元串的封裝類(String),直接實作了序列化接口。

它們也同時都實作了可比較(Comparable<T>)接口。

自己定義的類,實作序列化接口(implements java.io.Serializable)後,系統會提示:

The serializable class AppInfo does not declare a static final serialVersionUID field of type long

可以讓Eclipse自動為該類快速生成一個序列化版本唯一代碼(serialVersionUID),方法如下:

将光标放到該類(AppInfo)上,按快捷鍵Ctrl+1,彈出修複選項框;

可以選擇Add default serial version ID,這樣就會生成一個預設的serialVersionUID:

private static final long serialVersionUID = 1L;

也可以選擇Add generated serial version ID(推薦),系統根據類名等資訊,生成一個唯一的ID:

private static final long serialVersionUID = -6042866751654850757L;

當類名或成員等資訊被修改後,可以保持serialVersionUID不變,以便相容之前的版本。

如果重新生成了新的serialVersionUID,說明對該類進行了更新,不再相容之前的版本。

類的serialVersionUID不同後,用新類,去讀舊類的資料,會報java.io.InvalidClassException的異常。

這個文章,說的很詳細:http://www.mkyong.com/java-best-practices/understand-the-serialversionuid/

JAVA中,對象的序列化與serialVersionUID