對象序列化漫談

什麼是序列化

以特定的方式對類實例的瞬時狀態進行編碼保存的一種操做,叫作對象序列化。就是將對象的這個時刻的各類屬性各類值按照必定的規則變成二進制流,而後若是傳輸到別的jvm中,jvm能夠按照規則在將二進制流反序列化成對應的對象,而且對象裏面還有當時的數據和各類屬性。
 

序列化的做用

主要做用就是將序列化後的對象進行網絡傳輸,由此能夠實現對象調用,分佈式對象,等各類功能。
 

序列化的指標

一、對象序列化後的大小
一個對象會被序列化工具序列化爲一串byte數組,這其中包含了對象的field值以及元數據信息,使其能夠被反序列化回一個對象
二、序列化與反序列化的速度
一個對象被序列化成byte數組的時間取決於它生成/解析byte數組的方法
三、序列化工具自己的速度
序列化工具自己建立會有必定的消耗。
 

各類序列化的對比

java序列化

原理:類須要實現 Serializable接口,才能被jdk本身的序列化機制序列化,jdk序列化的時候,會將這個類和他的全部超類都元數據,類描述,屬性,屬性值等等信息都序列化出來,這樣就致使序列化後的大小比較大,速度也會比較慢,可是包含的內容最全面。能夠徹底反序列化。
 

 

 

Kryo序列化

原理:序列化的時候,會將對象的信息,對象屬性值的信息等進行序列化,並且沒有將類field的描述信息進行序列化,這樣就比jdk本身的序列化出來的小多了,並且速度確定更快,可是包含的信息沒有jdk的全面。相似下圖

 

Hessian序列化

原理:序列化的時候,也是將對象的信息,屬性值信息等進行序列化,也會比jdk本身的序列化後的小不少,可是沒有kryo的小,速度也挺快,相似下圖。

 

 

這兩種的對比

一、Kryo序列化後比Hessian小不少。(kryo優於hessian)
二、因爲Kryo沒有將類field的描述信息序列化,因此Kryo須要以本身加載該類的filed。這意味着若是該類沒有在kryo中註冊,或者該類是第一次被kryo序列化時,kryo須要時間去加載該類(hessian優於kryo)
三、因爲2的緣由,若是該類已經被kryo加載過,那麼kryo保存了其類的信息,就能夠很快的將byte數組填入到類的field中,而hessian則須要解析序列化後的byte數組中的field信息,對於序列化過的類,kryo優於hessian。
四、hessian使用了固定長度存儲int和long,而kryo則使用的變長,實際中,很大的數據不會常常出現。(kryo優於hessian)
五、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。)下圖簡單說明了各類序列化框架序列化同一個對象後的字節大小比較

 

----內容部分摘抄自網絡,若有侵權,請聯繫。java

相關文章
相關標籤/搜索