序列化是將對象狀態轉換為字節流的過程,用於網絡傳輸或持久化存儲;反序列化則是將字節流還原為對象的逆向操作。
Serializable 子接口,需實現 writeExternal() / readExternal()| # | 規則 | 說明 |
|---|---|---|
| 1 | serialVersionUID 必須一致 | 反序列化三條件:類路徑一致、功能代碼一致、序列化 ID 一致。建議顯式聲明 private static final long serialVersionUID = 1L; 避免跨版本兼容問題 |
| 2 | 引用對象級聯序列化 | 對象 A 引用 B,A 實現序列化則 B 自動序列化。若 B 未實現 Serializable 將拋出 NotSerializableException |
| 3 | 父類序列化傳遞性 | 父類實現序列化 → 子類自動序列化;子類序列化 → 父類不序列化,反序列化時調用父類無參構造器初始化 |
| 4 | transient 字段跳過序列化 | 標記為 transient 的字段視為臨時數據,序列化時忽略,反序列化後為默認值(null/0/false) |
| 5 | static 字段不屬於對象狀態 | static 代表類屬性,不參與對象序列化 |
| 6 | 敏感字段需自定義加密序列化 | 即使 private 也可被反序列化讀取。須重寫 writeObject() / readObject() 實現加密/解密邏輯。虛擬機優先調用自定義方法,否則走 defaultWriteObject/defaultReadObject |
| 7 | 同一對象重複寫入僅存儲引用 | 同一對象多次 writeObject,文件大小不翻倍,僅增加引用控制信息 |
private void writeObject(ObjectOutputStream out) throws IOException {
// 加密敏感字段
out.defaultWriteObject(); // 先執行默認序列化
// 或手動控制每個字段寫入順序
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject(); // 先執行默認反序列化
// 解密敏感字段
}