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

Java 序列化通俗解釋:為什麼需要它?

     編輯:程式設計綜合問答

一句話定義

序列化 = 將記憶體中的物件轉換為位元組序列(可儲存檔案、網路傳輸);反序列化 = 從位元組序列還原物件。

為什麼需要?

場景一:進程間通訊 (IPC) / 網路傳輸

兩個 Java 程式(甚至不同機器)要交換物件,網路只能傳輸位元組。序列化把物件「壓扁」成 byte[],對方收到後「吹氣」還原。

// 發送端
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(myObject);
byte[] data = bos.toByteArray();
socket.getOutputStream().write(data);

// 接收端
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
MyClass obj = (MyClass) ois.readObject();

場景二:物件持久化(儲存到檔案/資料庫)

直接將物件寫入檔案,下次啟動還原,免去手動解析 JSON/XML/屬性檔。

場景三:分散式快取/Session 複製

Redis、Memcached、Tomcat Cluster 複製 Session 時,皆需物件可序列化。

核心機制

  • 實作 java.io.Serializable 標記介面(無方法)。
  • JVM 依據 serialVersionUID 驗證版本相容性(建議顯式宣告)。
  • 預設序列化所有 non-transient、non-static 欄位。
  • 可自訂 writeObject/readObject 控制細節。

不是加密!

序列化產生的位元組**可被反編譯還原**,不具備機密性。若需安全,請配合加密演算法(AES)或使用 JWT/Protobuf 等替代方案。

效能與替代方案

方案優點缺點
Java 原生序列化零配置、支援任意物件圖體積大、速度慢、跨語言差、安全風險
JSON (Jackson/Gson)人類可讀、跨語言、生態豐富需手動映射、不支援循環參考(需配置)
Protocol Buffers極小體積、極快、強型別、跨語言需定義 .proto、學習曲線
Kryo / FST比原生快 5-10 倍、體積小需額外依賴、僅 Java

最佳實務

  1. 明確宣告 private static final long serialVersionUID = 1L;。
  2. 敏感欄位標記 transient(密碼、資料庫連線等)。
  3. 跨系統傳輸優先考慮 JSON/Protobuf。
  4. 不要將序列化資料長期儲存作為資料庫替代品(版本演進困難)。

理解序列化本質是「物件扁平化為位元組」,即可在正確場景正確使用。

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