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

Java 序列化技術深度解析:原生 vs Hessian 效能對比

     編輯:Java 相關知識

序列化基礎概念

序列化是將物件轉換為位元組串流,以便網路傳輸或持久化儲存;反序列化則是將位元組串流還原為物件。Java 遠端呼叫 (RPC)、分散式快取、訊息佇列等場景都大量依賴序列化機制。

Java 原生序列化

特點

  • 完整保留類別中繼資料 (類名、欄位、繼承關係等) 與業務資料
  • 支援任意實作 Serializable 介面的物件
  • 輸出位元組較大,效能較低
  • 相容性最強,幾乎所有 Java 環境皆可直接使用

實作範例

public static byte[] serialize(Object obj) throws Exception {
    if (obj == null) throw new NullPointerException();
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    ObjectOutputStream out = new ObjectOutputStream(os);
    out.writeObject(obj);
    return os.toByteArray();
}

public static Object deserialize(byte[] bytes) throws Exception {
    if (bytes == null) throw new NullPointerException();
    ByteArrayInputStream is = new ByteArrayInputStream(bytes);
    ObjectInputStream in = new ObjectInputStream(is);
    return in.readObject();
}

Hessian 序列化

特點

  • 二進位協定,體積小、速度快 (通常比原生快 2-5 倍)
  • 僅序列化資料與簡單型別資訊,不保留完整類別結構
  • 支援參考共享 (Reference Sharing):同一物件多次出現時僅序列化一次,後續用索引參考
  • 跨語言支援良好 (Java、Python、PHP、Go 等皆有實作)
  • 不支援某些特殊型別 (如 short、StackTraceElement 等需特殊處理)

實作範例

// 需引入 hessian 依賴: com.caucho:hessian:4.0.74
public static byte[] serialize(Object object) throws Exception {
    if (object == null) throw new NullPointerException();
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    HessianSerializerOutput hessianOutput = new HessianSerializerOutput(os);
    hessianOutput.writeObject(object);
    return os.toByteArray();
}

public static Object deserialize(byte[] bytes) throws Exception {
    if (bytes == null) throw new NullPointerException();
    ByteArrayInputStream is = new ByteArrayInputStream(bytes);
    HessianSerializerInput hessianInput = new HessianSerializerInput(is);
    return hessianInput.readObject();
}

核心差異對比

維度Java 原生Hessian
序列化體積大 (含完整中繼資料)小 (僅資料+型別)
序列化速度較慢快 2-5 倍
反序列化速度較慢快
相容性極強 (JDK 內建)需第三方庫
跨語言困難原生支援
物件圖支援完整 (含循環參考)良好 (有參考機制)
特殊型別全支援部分不支援

選型建議

  • 內部 Java 微服務、高效能 RPC:優先選擇 Hessian、Protobuf、Kryo 等高效二進位協定
  • 跨語言系統整合:Hessian、Protobuf、Avro、MessagePack
  • 持久化儲存、低頻呼叫、需完整型別資訊:Java 原生序列化或 JSON (Jackson/Gson)
  • 舊系統相容、快速原型:Java 原生序列化零依賴最便利

總結

沒有完美的序列化方案,只有最適合場景的選擇。理解各方案的權衡 (體積、速度、相容性、跨語言),才能做出正確架構決策。

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