Java 序列化是將物件狀態轉換為位元組流,以便持久化存儲或網路傳輸的核心機制。本文系統梳理序列化的基本概念、核心接口、關鍵特性、適用場景,並對比 Serializable 與 Externalizable 的優劣,幫助開發者做出正確技術選型。
序列化包含兩階段:序列化(物件 → 位元組流)與 反序列化(位元組流 → 物件)。它不僅保存基本型別欄位,還會遞歸保存物件引用鏈上的所有可序列化物件,實現「深複製」。
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 | Externalizable |
|---|---|---|
| 實現難度 | 極低(僅實現接口) | 需手動實現 readExternal/writeExternal |
| 儲存開銷 | 大(含類元數據、引用資訊) | 小(僅存類標識,由開發者決定存什麼) |
| 效能 | 較慢(反射、預設機制) | 可優化,速度潛力大 |
| 適用場景 | 通用、快速開發、物件圖複雜 | 高效能、大物件、需精確控制格式 |
Serializable,滿足多數業務需求。Externalizable 或 Protobuf、Avro 等現代序列化框架。serialVersionUID,並保持欄位相容性(新增欄位預設值、勿刪除舊欄位)。