高性能序列化与反序列化
目前有很多通用的序列化实现,比如java和go都内置了序列化实现,还有一些开源的序列化框架,比如Google 的 Protobuf、Kryo、Hessian 等,
以及像json,二进制这种标准会的数据格式也可以作为序列化的实现。
首先我们选用数列化实现有哪几个维度呢?
- 序列化后数据要有良好的可读性
- 实现的复杂度较低
- 性能比较好,序列化和反序列化的速度较快
- 信息密度较大,就是说同样的结构化数据,序列化后所占的空间越小越好。
当然,不会存在一种序列化实现在这四个方面都是最优的,否则我们就没必要来纠结到底选择哪种实现了。因为,大多数情况下,易于阅读和信息密度是矛盾的,实现的复杂度和性能也是互相矛盾的。所以,我们需要根据所实现的业务,来选择合适的序列化实现。
像 JSON、XML 这些序列化方法,可读性最好,但信息密度也最低。像 Kryo、Hessian 这些通用的二进制序列化实现,适用范围广,使用简单,性能比 JSON、XML 要好一些,但是肯定不如专用的序列化实现。
专用化的序列化不需要考虑通用性,比如,我们可以固定字段的顺序,这样在序列化后的字节里面就不必包含字段名,只要字段值就可以了,不同类型的数据也可以做针对性的优化,
从而达到提高性能,增加信息密度的目的。
举例来说使用专用的序列化方法:
要序列化的User对象
user: name: "zhangsan" age: 23 married: true
我们可以将其序列化这样:
03 | 08 7a 68 61 6e 67 73 61 6e | 17 | 01 User | z h a n g s a n | 23 | true
第一段 :03 代表User对象
第二段:由于name的长度是不固定的所以用第一个字节来代表name的长度,后面的8个字节则代表name的数据
第三段:是年龄,我们直接用一个字节表示就可以了,23 的 16 进制是 17 。
最后一个段是婚姻状态,我们用一个字节来表示,01 表示已婚,00 表示未婚,这里面保存一个 01。
总体来说,大多数情况下,选择一个高性能的通用序列化框架都可以满足要求,在性能可以满足需求的前提下,推荐优先选择 JSON 这种可读性好的序列化方法。
Don’t hurry say have no choice, perhaps, next intersection will meet hope.