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

推荐订阅源

S
Schneier on Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Threat Research - Cisco Blogs
C
Cyber Attacks, Cyber Crime and Cyber Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
A
Arctic Wolf
Security Latest
Security Latest
Simon Willison's Weblog
Simon Willison's Weblog
I
Intezer
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Troy Hunt's Blog
Latest news
Latest news
Help Net Security
Help Net Security
S
Security Affairs
Webroot Blog
Webroot Blog
The Hacker News
The Hacker News
AI
AI
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Tor Project blog
Forbes - Security
Forbes - Security
Google DeepMind News
Google DeepMind News
AWS News Blog
AWS News Blog
Attack and Defense Labs
Attack and Defense Labs
P
Proofpoint News Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
H
Help Net Security
L
Lohrmann on Cybersecurity
S
SegmentFault 最新的问题
Google Online Security Blog
Google Online Security Blog
MongoDB | Blog
MongoDB | Blog
Cyberwarzone
Cyberwarzone
The Last Watchdog
The Last Watchdog
S
Securelist
N
News and Events Feed by Topic
S
Secure Thoughts
F
Fortinet All Blogs
博客园_首页
C
Cybersecurity and Infrastructure Security Agency CISA
量子位
M
MIT News - Artificial intelligence
F
Full Disclosure
T
The Blog of Author Tim Ferriss
T
Tailwind CSS Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Microsoft Security Blog
Microsoft Security Blog
I
InfoQ
P
Privacy International News Feed
L
LangChain Blog
Know Your Adversary
Know Your Adversary
C
CERT Recently Published Vulnerability Notes

博客园 - 李潘

我们为什么需要分布式系统? 怎么算是在工作中负责? 怎么更好的沟通? 怎么用工作邮件? 为工作排好优先级 聊聊数据压缩 怎么使用硬件同步原语替代锁? 怎么正确使用锁? 聊聊缓存 为什么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这种可读性好的序列化方法。如果我们需要超高的性能或者带宽非常有限,那么我们可以使用专用的序列化方法来提升性能,节省传输流量。