java.io.Serializable 是一個標記介面——無任何方法與欄位,唯一語意是「宣告實作此介面的類允許被序列化」。未實作該介面的類,其狀態無法被序列化或反序列化。所有子類若父類實作了 Serializable,預設也是可序列化的。
允許非序列化父類的子類實作 Serializable,但子類必須負責保存/恢復父類的 public、protected 及可訪問的 package-private 欄位。前提是父類擁有 public 或 protected 的無參建構子,否則反序列化時會拋出 InvalidClassException(運行時檢測)。
public/protected)。若類需自定序列化邏輯,須實作以下 private 方法(非介面方法,由反射調用):
private void writeObject(ObjectOutputStream out) throws IOException;
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
writeObject:寫入物件狀態,可呼叫 out.defaultWriteObject() 觸發預設機制(非 static、非 transient 欄位)。readObject:讀取並恢復狀態,可呼叫 in.defaultReadObject() 觸發預設恢復。新增欄位時相容性由流中資訊自動處理。private static final long serialVersionUID,避免跨版本反序列化失敗。Serializable 雖是標記介面,但其背後涉及物件圖遍歷、版本演進、父類協作等機制。掌握 writeObject/readObject、serialVersionUID、transient 等細節,是構建健壯分散式/持久化 Java 系統的基本功。