一般来说,数据的处理有两种类型。一种是在内存中,比如我们常见的结构体,list,数组等等。而另外一种就是把数据写到文件中或者在网络中进行传输,这个时候的数据传输说白了就是比特流,那么接受方如何解析这些接收到的比特流呢?这个时候就需要对数据进行序列化,把相应的数据转化成可以自解释比特流。然后接收方就可以通过反序列化的方法把这些比特流再转化成相应的结构体等等类型。
各种语言自带的格式
很多语言都有自带的序列化方法,比如Java.io.Serializable,Python的pickle等等。它们用起来很方便,但是也存在一定的局限性:
- 假如序列化是来自于特定的语言,那么反序列化也得是相应的语言。这就给不同语言之间的交流(比如客户端和服务端使用不同语言)带来了困难。
- 因为允许反序列化时实例化任意的类,所以很容易造成漏洞,给安全攻击带来了可能。
- 这些语言特定库的向前和向后兼容性一般都不太好。
- 性能一般来说都不是很好,它们的CPU使用率以及压缩比一般来说都不是很理想。
所以一般来说不太会使用语言自带的序列化和反序列化函数,那么除了语言自带的函数还有哪些选择呢?
JSON,XML和CSV
比较常见的不依赖于语言的序列化标准有JSON, XML。前者因为其是浏览器的内置支持格式而流行,后者则有时被大家认为太繁琐和复杂了。当然还有CSV格式也有很多人使用。这些格式其实对人的可读性来说都比较友好,但也各有其问题:
- 数字的序列化比较差。XML和CSV你基本上很难区分数字和包含数字的字符(除非特殊处理)。JSON虽然好一点,但是它不