C/C++笔记:序列化与反序列化
来源:学习编程__     阅读:763
源码超市
发布于 2019-03-26 02:10
查看主页

序列化指的是将一个内存对象转化成一串字节数据(存储在一个字节数组中),可用于保存到本地文件或者网络传输。反序列化就是将字节数据复原成内存对象。

如:

struct student

{

? ? int id;

? ? string name;

};

一个student对象转换成字节数据存储在ByteArray[20]中称为序列化代码如

int count = 0;

char ByteArray[20];

student s;

s.id = 12;

s.name = "specialist";

memcpy(ByteArray,&s.id,sizeof(s.id));

count += sizeof(s.id);

memcpy(ByteArray+count,s.name.c_str(),s.name.length());

count += s.name.length();

把字节数据复原成student对象称为反序列化代码如

student ss;

memcpy(&ss.id,ByteArray,sizeof(ss.id));

ss.name.append(ByteArray+4,count-4);

其实在上述代码中存在问题只是memcpy函数隐藏了这个细节。在vs的内存窗口中我们可以看到s.id的内存视图为0c 00 00 00,这似乎和我们想的00 00 00 0c不一样,这就是所谓的大端系统(内存中高字节在前)和小端系统(内存中低字节在前),而目前我们的系统大多是小端系统,而一般在网络传输中却规定使用大端传输(很奇怪我也很好奇为什么),这时候我们就需要将小端转换成大端,显然此时memcpy不再适用,于是我们使用位操作来实现小端转大端,以s.id为例代码如

ByteArray[0] = s.id>>24;

ByteArray[1] = s.id>>26;

ByteArray[2] = s.id>>8;

ByteArray[3] = s.id;

此时复原成s.id对象代码如

s.id += ByteArray[0]<<24;

s.id += ByteArray[1]<<16;

s.id += ByteArray[2]<<8;

s.id += ByteArray[3];

免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 系统环境 服务器应用
相关推荐
Java并发编程,Condition的await和signal等待通知机制
自己设置PopupWindow轻松实现从底部弹出
8年前台开发的知识点沉淀(不知道会多少字,一直写下去吧...)
处理图片底部间隙问题
2019 github热门项目
首页
搜索
订单
购物车
我的