高性能序列化与反序列化

  目前有很多通用的序列化实现,比如java和go都内置了序列化实现,还有一些开源的序列化框架,比如Google 的 Protobuf、Kryo、Hessian 等,

以及像json,二进制这种标准会的数据格式也可以作为序列化的实现。

  首先我们选用数列化实现有哪几个维度呢?

  1. 序列化后数据要有良好的可读性
  2. 实现的复杂度较低
  3. 性能比较好,序列化和反序列化的速度较快
  4. 信息密度较大,就是说同样的结构化数据,序列化后所占的空间越小越好。

  当然,不会存在一种序列化实现在这四个方面都是最优的,否则我们就没必要来纠结到底选择哪种实现了。因为,大多数情况下,易于阅读和信息密度是矛盾的,实现的复杂度和性能也是互相矛盾的。所以,我们需要根据所实现的业务,来选择合适的序列化实现。

  像 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 这种可读性好的序列化方法。

posted @ 2020-02-11 22:02  以梦为码  阅读(782)  评论(0编辑  收藏  举报