Java幾種序列化方式對比

轉:https://juejin.cn/post/6919026394382991373

1:爲什麼要序列化

網絡傳輸的數據都必須是二進制數據,但是在Java中都是對象,是沒有辦法在網絡中進行傳輸的,所以就需要對Java對象進行序列化,而且這個要求這個轉換算法是可逆的,不然要是不可逆那鬼知道你傳過來的是個什麼東西

2:Java原生序列化

只要讓類實現 Serializable 接口就行,序列化具體的實現是由ObjectOutputStream和ObjectInputStream來實現的

缺點:

  • 1:序列化碼流太大
  • 2:序列化效率低
  • 3:無法跨語言

優點:

  • 1:簡單

3:JSON序列化

JSON 可能是我們最熟悉的一種序列化格式了,JSON 是典型的 Key-Value 方式,沒有數據類型,是一種文本型序列化框架,JSON 的具體格式和特性,網上相關的資料非常多,這裏就不再介紹了。他在應用上還是很廣泛的,無論是前臺 Web 用 Ajax 調用、用磁盤存儲文本類型的數據,還是基於 HTTP 協議的 RPC 框架通信,都會選擇 JSON 格式。

缺點:

  • 1:JSON進行序列化的額外空間開銷比較大,對於大數據量服務就意味着需要巨大的內存和磁盤開銷
  • 2:JSON沒有類型,但像Java這種強類型語言,需要通過反射統一解決,所以性能不會太好

優點:

  • 1:簡潔明瞭

3:Hessian

Hessian 是動態類型、二進制、緊湊的,並且可跨語言移植的一種序列化框架。Hessian 協議要比 JDK、JSON 更加緊湊,性能上要比 JDK、JSON 序列化高效很多,而且生成的字節數也更小

Student student = new Student(); 
student.setNo(101);  
student.setName("HESSIAN"); 
//把student對象轉化爲byte數組
ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
Hessian2Output output = new Hessian2Output(bos); 
output.writeObject(student); 
output.flushBuffer(); 
byte[] data = bos.toByteArray(); 
bos.close(); 
//把剛纔序列化出來的byte數組轉化爲student對象
ByteArrayInputStream bis = new ByteArrayInputStream(data); 
Hessian2Input input = new Hessian2Input(bis); 
Student deStudent = (Student) input.readObject(); 
input.close(); 
System.out.println(deStudent);

缺點:

  • 1:官方版本對Java裏面一些常見對象的類型不支持,
  • 比如LinkedHashMap、LinkedHashSet 等,但是可以通過擴展CollectionDeserializer 類修復,
  • Locale 類,可以通過擴展 ContextSerializerFactory 類修復;
  • Byte/Short 反序列化的時候變成 Integer

優點:

  • 1:相對於JDk,JSON,更加高效,生成的字節數更小
  • 2:有非常好的兼容性和穩定性

4:Protobuf

Protobuf 是 Google 公司內部的混合語言數據標準,是一種輕便、高效的結構化數據存儲格式,可以用於結構化數據序列化,支持 Java、Python、C++、Go 等語言。Protobuf使用的時候需要定義 IDL(Interface description language),然後使用不同語言的 IDL編譯器,生成序列化工具類

缺點:

  • 1:爲了提高性能,protobuf採用了二進制格式進行編碼。這直接導致了可讀性差
  • 2:對於具有反射和動態語言來講,用起來比較費勁

優點:

  • 1:高效
  • 2:支持多種語言
  • 3:支持向前,向後兼容

5:Thrift

Thrift是Facebook於2007年開發的跨語言的rpc服框架,提供多語言的編譯功能,並提供多種服務器工作模式,用戶通過Thrift的IDL(接口定義語言)來描述接口函數及數據類型,然後通過Thrift的編譯環境生成各種語言類型的接口文件,用戶可以根據自己的需要採用不同的語言開發客戶端代碼和服務器端代碼。

缺點:

  • 1:沒有官方文檔
  • 2:Thrift序列化二進制不可讀,調試困難
  • 3:buf fix 和更新不積極,維護成本過高
  • 4:RPC 在 0.6.1 升級到 0.7.0 是不兼容的

優點:

  • 1:特性豐富
  • 2:性能不錯
  • 3:有很多開源項目的周邊支持 都是 thrift

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章