网络传输序列化以及序列化形式(文本、二进制)

本文解释了对象序列化的基本概念及其重要性,介绍了几种常见的序列化手段包括JSON、XML、BSON和Protocol Buffers等,并讨论了文本格式和二进制格式各自的优缺点。

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

当对象需要持久化到硬盘或者网络传输的时候,我们需要进行序列化(也就是保存内存中的对象的状态)

序列化就是将内存中的对象流化,方便我们进行写入读取

为什么要序列化,因为在对象中可能会保存有指针,或者是其他对象的引用。如果我们不加处理,将指针保存,这是没有意义的,因为反序列化的时候是重新分配内存的。如果有其他的对象的引用,我们不能为每个对象都保留一份副本。另外需要网络传输的时候,序列化也要考虑统一字节序以及数据对齐带来的差异。

序列化的手段(摘自网上)

以下序列化机制的解决方案:
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协议是基于文本格式的,指的是协议的指令、状态是文本格式的,但是传输的东西可以是文本也可以是二进制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值