深入浅出理解数据的序列化和反序列化

数据处理包括内存中的结构和比特流传输。序列化将数据转化为自解释比特流,便于网络传输和文件存储,反序列化则将比特流还原为结构。文章讨论了语言自带的序列化方法如Java.io.Serializable和Python的pickle,指出其局限性,并介绍了JSON、XML、CSV等通用格式的优缺点。接着,提到了二进制编码如MessagePack、Thrift和Protocol Buffers,它们减少了数据冗余,提高效率,特别是Thrift的BinaryProtocol和CompactProtocol。最后,文章介绍了Avro,一种依赖于相同schema的二进制编码方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般来说,数据的处理有两种类型。一种是在内存中,比如我们常见的结构体,list,数组等等。而另外一种就是把数据写到文件中或者在网络中进行传输,这个时候的数据传输说白了就是比特流,那么接受方如何解析这些接收到的比特流呢?这个时候就需要对数据进行序列化,把相应的数据转化成可以自解释比特流。然后接收方就可以通过反序列化的方法把这些比特流再转化成相应的结构体等等类型。

各种语言自带的格式

很多语言都有自带的序列化方法,比如Java.io.Serializable,Python的pickle等等。它们用起来很方便,但是也存在一定的局限性:

  1. 假如序列化是来自于特定的语言,那么反序列化也得是相应的语言。这就给不同语言之间的交流(比如客户端和服务端使用不同语言)带来了困难。
  2. 因为允许反序列化时实例化任意的类,所以很容易造成漏洞,给安全攻击带来了可能。
  3. 这些语言特定库的向前和向后兼容性一般都不太好。
  4. 性能一般来说都不是很好,它们的CPU使用率以及压缩比一般来说都不是很理想。

所以一般来说不太会使用语言自带的序列化和反序列化函数,那么除了语言自带的函数还有哪些选择呢?

JSON,XML和CSV

比较常见的不依赖于语言的序列化标准有JSON, XML。前者因为其是浏览器的内置支持格式而流行,后者则有时被大家认为太繁琐和复杂了。当然还有CSV格式也有很多人使用。这些格式其实对人的可读性来说都比较友好,但也各有其问题:

  1. 数字的序列化比较差。XML和CSV你基本上很难区分数字和包含数字的字符(除非特殊处理)。JSON虽然好一点,但是它不
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值