首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JavaBean 為何必須實作 Serializable?序列化機制深度解析

     編輯:Java 綜合教學

什麼是物件序列化?

Java 物件序列化能將實作 Serializable 介面的物件轉換為位元組序列,隨後可從位元組完全重建物件。此機制甚至跨平台運作(Windows 序列化 → Unix 反序列化),自動處理位元組序、資料表示等底層差異。

三大核心用途

  1. 輕量級持久化:物件寫入磁碟,程式重啟時讀回,生命週期超越 JVM 進程
  2. RMI 遠端方法調用:跨 JVM 傳遞參數與返回值,序列化是傳輸基礎
  3. JavaBean 狀態保存:設計工具中 Bean 的屬性配置需持久化,下次載入恢復狀態

Serializable 介面本質

public interface Serializable {
    // 標記介面:無任何方法、無任何欄位
    // 僅作為語義標識:實作此介面的類允許被序列化
}
  • 所有子類別自動具備可序列化性
  • 若父類別不可序列化,子類別需負責保存/恢復父類別的可訪問欄位(需有無參建構子)
  • transient 與 static 欄位不參與序列化

序列化與反序列化實戰

// 序列化寫入
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.dat"));
oos.writeObject(myObject);
oos.close();

// 反序列化讀取
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.dat"));
MyObject obj = (MyObject) ois.readObject();  // 需向下轉型
ois.close();

物件圖深度遍歷

序列化不僅保存物件本身,還會遞歸追蹤其引用的所有物件(物件圖),包含陣列、集合內部元素。這點極其強大——手動實作需編寫複雜遍歷邏輯,Java 內建機制自動優化完成。

JavaBean 規範要求

「當 Bean 在建構工具中被客製化並與其他 Bean 建立連接後,其所有狀態必須可被保存,下次載入時恢復上次狀態。因此 Bean 應實作 java.io.Serializable。」

public class Button implements java.io.Serializable {
    // 所有公開屬性自動保存
    // 不想保存的欄位加 transient 或 static
    private transient String tempCache;  // 不序列化
    private static final String CONST = "固定值";  // 不序列化
}

版本控制:serialVersionUID

private static final long serialVersionUID = 1L;
  • 明確宣告可避免類結構變更導致的 InvalidClassException
  • 修改類結構(增減欄位、修改存取修飾符、改變 transient/static)會改變存儲關係,需更新 UID
  • IDE 通常可自動生成

進階:自定義序列化邏輯

private void writeObject(ObjectOutputStream out) throws IOException {
    out.defaultWriteObject();  // 執行預設序列化
    // 額外邏輯:加密敏感欄位、壓縮大物件等
}

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    in.defaultReadObject();
    // 額外邏輯:解密、初始化 transient 欄位等
}

替代方案對比

方案適用場景優點缺點
Java 序列化臨時持久化、RMI、Bean 工具零配置、內建、物件圖自動遍歷效能一般、二進制不透明、版本演進脆弱
JSON (Jackson/Gson)Web API、配置檔、跨語言可讀、通用、版本容忍度高需依賴庫、不支援物件圖循環引用(需配置)
Protobuf/Avro高效能 RPC、大數據存儲極致效能、Schema 演進嚴格需定義 Schema、學習曲線陡峭
JDO/Hibernate企業級持久化完整 ORM、查詢語言、事務管理重量級、配置複雜

總結

實作 Serializable 是 JavaBean 規範的強制要求,支援設計工具的狀態保存與 RMI 通訊。雖然現代架構多採 JSON/資料庫持久化,但理解序列化機制(物件圖遍歷、版本控制、transient 語義)仍是 Java 進階開發者的必修內功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved