当对象需要持久化到硬盘或者网络传输的时候,我们需要进行序列化(也就是保存内存中的对象的状态)
序列化就是将内存中的对象流化,方便我们进行写入读取
为什么要序列化,因为在对象中可能会保存有指针,或者是其他对象的引用。如果我们不加处理,将指针保存,这是没有意义的,因为反序列化的时候是重新分配内存的。如果有其他的对象的引用,我们不能为每个对象都保留一份副本。另外需要网络传输的时候,序列化也要考虑统一字节序以及数据对齐带来的差异。
序列化的手段(摘自网上)
以下序列化机制的解决方案:
1.保存到磁盘的所有对象都获得一个序列号(1, 2, 3等等)
2.当要保存一个对象时,先检查该对象是否被保存了
3.如果以前保存过,只需写入"与已经保存的具有序列号x的对象相同"的标记,否则,保存该对象
通过以上的步骤序列化机制解决了对象引用的问题!
json xml 以及 bson protobuf 是常用的序列化手段,前面两个是基于文本的,后面两个是基于二进制的。无论是文本格式还是二进制格式,存储的都是二进制。例如
struct A{
int a;
int b;
}s(1,2);
json序列化的结果是:'{a:1,b:2} '是根据字符编码序列化为文本形式。而bson则是内存中的数据按其在内存中的存储形式原样取出即可。
这两个各有好处,文本格式是通用简单,可扩展性强,所谓可扩展性强也就是可以增加数据结构中的字段并且向后兼容。还拿上面的结构体举列子。比如struct{int a;int b;}s={1,2};,序列化成Json就变成:{a:1,b:2},可以再添加一个字段c,变成{a:1,b:2,c:3}而不影响老版本的程序,它们可以忽略字段c。文本格式的缺点是占用内存多,效率低下。而这两点在二进制中有了好的改变,但是二进制实现是比较麻烦的。我们更多用的是自己设计的格式。
http协议是基于文本格式的,指的是协议的指令、状态是文本格式的,但是传输的东西可以是文本也可以是二进制。