一、前言
在TCP的连接上,它传输数据的基本形式就是二进制流,也就是一段一段的1和0。在一般编程语言或者网络框架提供的API中,传输数据的基本形式是字节,也就是Byte。一个字节就是8个二进制位,8个Bit,所以在这里,二进制流和字节流本质上是一样的。对于我们编写的程序来说,它需要通过网络传输的数据是结构化的数据,比如,一条命令、一段文本或者一条消息。对应代码中,这些结构化的数据都可以用一个类或者一个结构体来表示。
要想使用网络框架的API来传输结构化的数据,必须得先实现结构化的数据与字节流之间的双向转换。这种将结构化数据转换成字节流的过程,称为序列化,反过来转换,就是反序列化。序列化的用途除了用于在网络上传输数据以外,另外一个重要用途是,将结构化数据保存在文件中,因为文件内保存数据的形式也是二进制序列。
二、选择哪种序列化实现
Java和Go语言都内置了序列化实现,也有一些流行的开源序列化实现,比如,Googel的Protobuf、Kryo、Hessian等;此外,像JSON、XML这些标准的数据格式,也可以作为一种序列化实现来使用。当然,也可以自己来实现私有的序列化实现。
面对这么多种序列化实现,需要权衡几个因素:
序列化后的数据最好是易于人类阅读的
实现的复杂度是否足够低
序列化和反序列化的速度越快越好
序列化后的信息密度越大越好,也就是说,同样的一个结构化数据,序列化之后占用的存储空间越小越好
不存在一种序列化实现在这几个方面都是最优的,像JSON、XML可读性最好,但信息密度也最低。像Kryo、Hessi