怎么选择数据序列化方案?

什么是序列化和反序列化

当数据在网络上传输时,传输数据的基本形式是二进制流,要想使用网络框架的API来传输结构化的数据,必须得先实现结构化的数据和字节流之间的双向转换。将结构化数据转换成字节流的过程称为序列化,将字节流转换成结构化数据的过程称为反序列化。

序列化除了用于在网络上传输数据之外,还可以将结构化的数据保存在文本中,因为在文件内数据的形式也是二进制序列,和网络传输过程中的数据是一样的,所以序列化同样适用于将结构化数据保存到文本中。

怎么选择序列化实现?

我们有很多种通用的序列化实现方案,既包括了编程语言汇总内置的实现,也有各种开源方案。

当我们为项目选择合适的序列化方案时,可以考虑以下因素:

  1. 序列化后的数据易于人类阅读。
  2. 实现的复杂度是否足够低。
  3. 序列化和反序列化的速度越快越好。
  4. 序列化后的信息密度越大越好,即同样的一个结构化数据,序列化后占用的存储空间越小越好。
  5. 序列化和反序列化的过程都是安全的。

没有任何一种序列化方案可以满足上面所有条件,例如可读性和信息密度就是两个相悖的条件。

对于一些强业务类系统,例如电商、社交类的应用,它们业务复杂、需求变化快,但是对性能要求没有那么严苛,这种情况下,我们可以使用JSON这种实现简单、数据可读性好的序列化方案,方便后期接口调试和问题排查。

实现高性能的序列化和反序列化

有些中间件会对网络通信的性能要求比较高,例如消息队列,普通的序列化无法达到性能要求,这时,一般会选择定制实现高性能的转用序列化和反序列化方案,可以有效减少序列化后的字节长度。

例如,针对下面的数据内容:

User:
  name: "zhangsan"
  age: 23
  married: true

使用普通的JSON序列化方式,结果如下:

{"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

上述序列化后的内容,我们按照name、age、married的固定顺序来序列化这三个属性。

可以看到同样的对象,JSON序列化后需要47个字节,采用特定方式序列化后的内容只需要12个字节。

专用的序列化方式更加高效,序列化出来的字节更少,在网络传输过程汇总的速度也更快,但确定是需要为每种对象类型定义专门的序列化和反序列化方法,实现过程复杂。

因此,针对序列化方案选型,大多数情况下, 选择一个高性能的通用序列化框架都可以满足要求,在性能可以满足需求的前提下,推荐优先选择JSON这种可读性好的序列化方法。如果我们需要超高的性能或者带宽非常有限,那么我们可以使用专用的序列化方法来提升性能,节省传输流量。

posted @ 2023-03-13 06:57  李潘  阅读(58)  评论(0编辑  收藏  举报