hessian和msgpack差別?
對于序列化,有必要掌握它的原理,這樣在實際運用過程中,出現問題就能快速解決掉。
阿裡的dubbo預設使用的就是hessian序列化,它的特性是:序列化的時候,會寫入字段名稱,然後字段值,你可以想象為一個map。
而京東jsf預設使用的是msgpack序列化,它的特性是:序列化的時候,不寫入字段名字,會按字段順序寫入值,你可以想象為一個數組。
從這裡可以看出:msgpack序列化産生的資料包更小,網絡傳輸效率更搞。
壓測結果不同場景顯示提高10% - 30%。(從數組取值比map高效)
待測試内容:
其它一些差異:例如hessian對Map/List等集合支援就是全變成最普通的Hashmap或者ArrayList,一些指定的類型會丢失(例如LinkedHashMap-->HashMap),但是支援一些匿名的Map/List等集合類;
而msgpack會保留集合類的類型(例如LinkedHashMap),但是不支援一些匿名集合類(例如List.subList(),Map.keySet(),Collections.emptyList(),Guava的匿名集合類,資料庫查詢結果直接傳回的list)
如果需要支援字段順序不一樣的情況下調用:請使用hessian序列化,但為了性能及跨語言相容性,請在保證 用戶端與服務端的接口類檔案保持一緻的情況下使用msgpack序列化!!
特别注意:如果在bean中要增加新字段,請務必保證新字段加在字段序的最後!
案例:對象新增字段,放在中間位置,會導緻序列化失敗!