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

深入理解 Java 序列化機制:從 Serializable 到 Externalizable

     編輯:Java 相關知識

Java 序列化是將物件狀態轉換為位元組流,以便持久化存儲或網路傳輸的核心機制。本文系統梳理序列化的基本概念、核心接口、關鍵特性、適用場景,並對比 Serializable 與 Externalizable 的優劣,幫助開發者做出正確技術選型。

什麼是序列化?

序列化包含兩階段:序列化(物件 → 位元組流)與 反序列化(位元組流 → 物件)。它不僅保存基本型別欄位,還會遞歸保存物件引用鏈上的所有可序列化物件,實現「深複製」。

核心接口與關鍵點

java.io.Serializable

  • 標記接口,無方法,僅語義標識「可序列化」。
  • 子類自動可序列化;static、transient 欄位不參與序列化。
  • 建議顯式聲明 private static final long serialVersionUID,避免跨編譯器版本不一致導致 InvalidClassException。

自定義序列化邏輯

實現以下私有方法可控制序列化/反序列化細節:

private void writeObject(ObjectOutputStream out) throws IOException;
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;

替換物件

ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;
ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;

Serializable vs Externalizable

維度SerializableExternalizable
實現難度極低(僅實現接口)需手動實現 readExternal/writeExternal
儲存開銷大(含類元數據、引用資訊)小(僅存類標識,由開發者決定存什麼)
效能較慢(反射、預設機制)可優化,速度潛力大
適用場景通用、快速開發、物件圖複雜高效能、大物件、需精確控制格式

最佳實踐建議

  1. 優先使用 Serializable,滿足多數業務需求。
  2. 遇到效能瓶頸或需跨語言互操作時,考慮 Externalizable 或 Protobuf、Avro 等現代序列化框架。
  3. 永遠顯式聲明 serialVersionUID,並保持欄位相容性(新增欄位預設值、勿刪除舊欄位)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved