Hessian 序列化和反序列化實現


先聊聊 Java的序列化,Java官方的序列化和反序列化的實現被太多人吐槽,這得歸於Java官方序列化實現的方式。

1、Java序列化的性能經常被吐槽。
2、Java官方的序列化后的數據相對於一些優秀的序列化的工具,還是要大不少,比如probuf,這大大影響存儲和傳輸的效率。
3、Java序列化一定需要實現Serializable接口
4、Java序列化的 serialVersionUID 也是個大坑

另外,序列化和反序列化中還需要考慮:跨語言,新舊對象版本兼容,安全,性能。今天主要來說說,Hessian2是如何來解決這些問題的?

一、跨語言:hessian提供了一整套的byte[]的寫入規范,這個規范為其他的語言實現hessian的序列化和反序列化提供了可能。
http://hessian.caucho.com/doc/hessian-serialization.html

目前hessian2已經支持了非常多語言,Java,Node,php,Erlang,c#.......

二、新舊對象版本兼容:hessian2將類的描述信息寫入byte[]中,以便於在反序列化時候能正常。但是這樣就帶來了一個問題:序列化后的內容較大。

三、安全,hessian序列化時,會調用writeReplace方法得到一個新的對象,能將對象中的一些值進行加密后在進行序列化。

四、性能:hessian2的序列化在內容的序列化上做了一些優化,hessian2將需要序列化的多個相同的對象只會寫入一次,其他用到該對象的只使用對象的引用,而不重新寫入對象的描述信息和值信息。但是hessian2在描述信息上寫入的信息來兼容動態化的反序列化支持,所以內容相對於一些描述性的序列化工具(thrift,protobuf)來說,在性能上沒有優勢。

再回到序列化,相對於 Java來說,hessian的序列化從跨語言,新舊對象的版本兼容,安全以及性能方面都做的好,主要體現在:

一、Java的序列化無法跨語言。
二、新舊對象的版本Java可以通過一個serialVersionUID來處理,這就需要開發者關注序列化的幾個語義。
三、Java需要實現一個接口才能進行序列化和反序列化,序列化沒有進行加解密的接口。
四、Java序列化后的內容比Hessian更大,這不利於序列化本身的性能和網絡傳輸、以及存儲的性能。

當然我們還有更加優秀的一些序列化和反序列化的工具,根據不同的使用場景可以自行選擇!

對性能敏感,對開發體驗要求不高的內部系統。
  thrift/protobuf

對開發體驗敏感,性能有要求的內外部系統。
  hessian2

對序列化后的數據要求有良好的可讀性
  jackson/gson/xml

 


免責聲明!

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



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