隻有可序列化(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/