對于序列化,有必要掌握它的原理甚脉,這樣在實際運用過程中铆农,出現(xiàn)問題就能快速解決掉。
阿里的dubbo默認使用的就是hessian序列化猴凹,它的特性是:序列化的時候,會寫入字段名稱岭皂,然后字段值,你可以想象為一個map书劝。
而京東jsf默認使用的是msgpack序列化土至,它的特性是:序列化的時候,不寫入字段名字陶因,會按字段順序?qū)懭胫担憧梢韵胂鬄橐粋€數(shù)組解幽。
從這里可以看出:msgpack序列化產(chǎn)生的數(shù)據(jù)包更小,網(wǎng)絡傳輸效率更搞蝇刀。
壓測結(jié)果不同場景顯示提高10% - 30%徘溢。(從數(shù)組取值比map高效)
待測試內(nèi)容:
其它一些差異:例如hessian對Map/List等集合支持就是全變成最普通的Hashmap或者ArrayList,一些指定的類型會丟失(例如LinkedHashMap-->HashMap)然爆,但是支持一些匿名的Map/List等集合類;
而msgpack會保留集合類的類型(例如LinkedHashMap)奴烙,但是不支持一些匿名集合類(例如List.subList()剖张,Map.keySet(),Collections.emptyList()幅虑,Guava的匿名集合類,數(shù)據(jù)庫查詢結(jié)果直接返回的list)
如果需要支持字段順序不一樣的情況下調(diào)用:請使用hessian序列化倒庵,但為了性能及跨語言兼容性擎宝,請在保證 客戶端與服務端的接口類文件保持一致的情況下使用msgpack序列化!浑玛!
特別注意:如果在bean中要增加新字段,請務必保證新字段加在字段序的最后顾彰!
案例:對象新增字段,放在中間位置,會導致序列化失敾椅啊!