惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The GitHub Blog
The GitHub Blog
MyScale Blog
MyScale Blog
爱范儿
爱范儿
GbyAI
GbyAI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
美团技术团队
Y
Y Combinator Blog
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
Martin Fowler
Martin Fowler
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
M
MIT News - Artificial intelligence
博客园 - Franky
V
Visual Studio Blog
I
InfoQ
V
V2EX
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
博客园 - 司徒正美
L
LangChain Blog

博客园 - 李潘

我们为什么需要分布式系统? 怎么算是在工作中负责? 怎么更好的沟通? 怎么用工作邮件? 为工作排好优先级 聊聊数据压缩 怎么使用硬件同步原语替代锁? 怎么正确使用锁? 聊聊缓存 为什么Kafka的性能那么好? 怎么避免服务内存溢出? 应用程序之间的通信传输协议 怎么利用异步设计提升系统性能? 怎么处理消息积压问题? 怎么处理消息重发的问题? 怎么做才能不丢消息? 怎么用消息队列实现分布式事务? 聊聊消息队列中的基础概念 我们要选择哪个消息队列产品?
怎么选择数据序列化方案?
李潘 · 2023-03-13 · via 博客园 - 李潘

什么是序列化和反序列化

当数据在网络上传输时,传输数据的基本形式是二进制流,要想使用网络框架的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这种可读性好的序列化方法。如果我们需要超高的性能或者带宽非常有限,那么我们可以使用专用的序列化方法来提升性能,节省传输流量。