C/C++笔记:序列化与反序列化
序列化指的是将一个内存对象转化成一串字节数据(存储在一个字节数组中),可用于保存到本地文件或者网络传输。反序列化就是将字节数据复原成内存对象。
如:
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];
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » C/C++笔记:序列化与反序列化