转自:https://blog.csdn.net/csdn_y_xb/article/details/82077957
序列化指的是将一个内存对象转化成一串字节数据(存储在一个字节数组中),可用于保存到本地文件或网络传输。反序列化就是将字节数据还原成内存对象。
如:
-
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];