先聊聊 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