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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM