Java序列化和hessian序列化的區別

大樹葉發表於2017-09-12
在遠端呼叫中,需要把引數和返回值通過網路傳輸,這個使用就要用到序列化將物件轉變成位元組流,從一端到另一端之後再反序列化回來變成物件。
既然前面有一篇提到了hessian,這裡就簡單講講Java序列化和hessian序列化的區別。
首先,hessian序列化比Java序列化高效很多,而且生成的位元組流也要短很多。但相對來說沒有Java序列化可靠,而且也不如Java序列化支援的全面。而之所以會出現這樣的區別,則要從它們的實現方式來看。
先說Java序列化,具體工作原理就不說了,Java序列化會把要序列化的物件類的後設資料和業務資料全部序列化從位元組流,而且是把整個繼承關係上的東西全部序列化了。它序列化出來的位元組流是對那個物件結構到內容的完全描述,包含所有的資訊,因此效率較低而且位元組流比較大。但是由於確實是序列化了所有內容,所以可以說什麼都可以傳輸,因此也更可用和可靠。
而hessian序列化,它的實現機制是著重於資料,附帶簡單的型別資訊的方法。就像Integer a = 1,hessian會序列化成I 1這樣的流,I表示int or Integer,1就是資料內容。而對於複雜物件,通過Java的反射機制,hessian把物件所有的屬性當成一個Map來序列化,產生類似M className propertyName1 I 1 propertyName S stringValue(大概如此,確切的忘了)這樣的流,包含了基本的型別描述和資料內容。而在序列化過程中,如果一個物件之前出現過,hessian會直接插入一個R index這樣的塊來表示一個引用位置,從而省去再次序列化和反序列化的時間。這樣做的代價就是hessian需要對不同的型別進行不同的處理(因此hessian直接偷懶不支援short),而且遇到某些特殊物件還要做特殊的處理(比如StackTraceElement)。而且同時因為並沒有深入到實現內部去進行序列化,所以在某些場合會發生一定的不一致,比如通過Collections.synchronizedMap得到的map。

相關文章