1. 程式人生 > >物件序列化——java原生序列化、Kryo序列化效能比較和Hessian序列化

物件序列化——java原生序列化、Kryo序列化效能比較和Hessian序列化

什麼是序列化

以特定的方式對類例項的瞬時狀態進行編碼儲存的一種操作,叫做物件序列化。就是將物件的這個時刻的各種屬性各種值按照一定的規則變成二進位制流,然後如果傳輸到別的jvm中,jvm可以按照規則在將二進位制流反序列化成對應的物件,並且物件裡面還有當時的資料和各種屬性。

序列化的作用

主要作用就是將序列化後的物件進行網路傳輸,由此可以實現物件呼叫,分散式物件,等各種功能。

序列化的指標

1、物件序列化後的大小一個物件會被序列化工具序列化為一串byte陣列,這其中包含了物件的field值以及元資料資訊,使其可以被反序列化回一個物件2、序列化與反序列化的速度一個物件被序列化成byte陣列的時間取決於它生成/解析byte陣列的方法3、序列化工具本身的速度序列化工具本身建立會有一定的消耗。

各種序列化的對比

java序列化

原理:類需要實現 Serializable介面,才能被jdk自己的序列化機制序列化,jdk序列化的時候,會將這個類和他的所有超類都元資料,類描述,屬性,屬性值等等資訊都序列化出來,這樣就導致序列化後的大小比較大,速度也會比較慢,但是包含的內容最全面。可以完全反序列化。 

Kryo序列化

原理:序列化的時候,會將物件的資訊,物件屬性值的資訊等進行序列化,而且沒有將類field的描述資訊進行序列化,這樣就比jdk自己的序列化出來的小多了,而且速度肯定更快,但是包含的資訊沒有jdk的全面。類似下圖

Hessian序列化

原理:序列化的時候,也是將物件的資訊,屬性值資訊等進行序列化,也會比jdk自己的序列化後的小很多,但是沒有kryo的小,速度也挺快,類似下圖。

這兩種的對比

1、Kryo序列化後比Hessian小很多。(kryo優於hessian)2、由於Kryo沒有將類field的描述資訊序列化,所以Kryo需要以自己載入該類的filed。這意味著如果該類沒有在kryo中註冊,或者該類是第一次被kryo序列化時,kryo需要時間去載入該類(hessian優於kryo)3、由於2的原因,如果該類已經被kryo載入過,那麼kryo儲存了其類的資訊,就可以很快的將byte陣列填入到類的field中,而hessian則需要解析序列化後的byte陣列中的field資訊,對於序列化過的類,kryo優於hessian。4、hessian使用了固定長度儲存int和long,而kryo則使用的變長,實際中,很大的資料不會經常出現。(kryo優於hessian)5、hessian將序列化的欄位長度寫入來確定一段field的結束,而kryo對於String將其最後一位byte+x70用於標識結束(kryo優於hessian)

總結:

物件的序列化,其實就是將一個物件,按照一定的規則轉換成位元組陣列,並且可以按照規則在轉換回來,序列化後的大小越小,速度一般越快,當然也要看演算法和處理速度等,但是不一定適合各種場景,jdk的序列化雖然效率可能低,但是幾乎完全保證了反序列化後的結果的準確性。序列化框架有很多,遇到了可以查一下大概的原理和序列話的內容,比較看是否適合自己。網上也有各種評測序列話框架之間的效能比較。

另記:

在學習dubbo的時候看到,dubbo預設的序列化方式是 hessian2序列化( hessian是一種跨語言的高效二進位制序列化方式。但這裡實際不是原生的hessian2序列化,而是阿里修改過的hessian lite,它是dubbo RPC預設啟用的序列化方式),而再看dubbox的時候看到dubbox 引入Kryo和FST這兩種高效Java序列化實現,來逐步取代hessian2。( 其中,Kryo是一種非常成熟的序列化實現,已經在Twitter、Groupon、Yahoo以及多個著名開源專案(如Hive、Storm)中廣泛的使用。而FST是一種較新的序列化實現,目前還缺乏足夠多的成熟使用案例,但它還是非常有前途的。 在面向生產環境的應用中,我建議目前更優先選擇Kryo。)下圖簡單說明了各種序列化框架序列化同一個物件後的位元組大小比較轉自:https://www.cnblogs.com/liouwei4083/p/6123383.html