序列化与反序列化:如何通过网络传输结构化的数据
网络传输的数据是结构化的数据,这些数据对应在代码中就可以用一个类(Class)或者一个结构体(Struct)来表示。
使用网络框架的API来传输结构化的数据,必须得先实现结构化的数据与字节流之间的双向转换。
结构化数据 ——> 字节流 == 序列化,反之为反序列化。
序列化用途:
- 网络上的传输数据
- 将结构化的数据保存在文件中
海量数据的场景中,需要将对象序列化后把它们暂时从内存转移到磁盘中,等需要用的时候,再把数据从磁盘中读取出来,反序列化成对象使用。便于长期保存且节省内存空间。
1. 该选择哪种序列化实现
java语言内置了序列化实现,流行的开源序列化实现:Google的Protobuf、Kryo、Hessian等;
像JSON、XML这些标准的数据格式,也可以作为一种序列化实现来使用。
也可以自己来实现私有的序列化。
选择序列化实现的几个因素:
- 序列化后的数据最好是易于人类阅读的;
- 实现的复杂度是否足够低
- 序列化和反序列化的速度越快越好
- 序列化后的信息密度越大越好,也就是说,同样的一个结构化数据,序列化之后占用的存储空间越小越好
JSON、XML这些序列化方法,可读性最好,但密度性也很低。
Kryo、Hessian这些通用的二进制序列化实现,使用范围广,使用简单,性能比JSON、XML要好一些,