Contents
  1. 1. 为什么要序列化和反序列化?
  2. 2. 哪些场景下需要?
  3. 3. 字节对齐、大小端对齐

在开发中,我们都知道序列化是将对象或数据结构转换为二进制序列,反序列化是二进制序列转换为对象或数据结构,最常用在需要进行通信的对象类中。通过回答三个问题去学习理解:

  1. 为什么要序列化和反序列化?

  2. 哪些场景下需要?

  3. 附加回答字节对齐、大小端对齐在(反)序列化中的运用?

为什么要序列化和反序列化?

常以文件保存为例来说明(反)序列化的作用:首先对于一个实例对象,即使不序列化也是可以正常保存的,但是当我们将该文件拿到其他人的电脑读取时却未必能够读取成功,原因在于我们直接保存的数据并不具有一个标准的格式。而序列化就是将数据以某种规定好的格式(例如xml格式)保存的过程,这种标准格式的数据在绝大多数情况下都能够被识别,为我们的开发过程中带来了很大的便利。

最重要的作用应在于客户端和服务端之间的通信上,实现对象中数据的正确解读,在定义类或结构中重载DataStream实现序列化操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//序列化
friend QDataStream &operator<<(QDataStream& input,const People &iteam)
{
//vector 数据类型需要用vector<People>::fromStdVector 转一下
//如果是QList则不需要直接插入
QVector<QString> strvecfamily = QVector<QString>::fromStdVector(iteam.vecfamily);
input << iteam.age << iteam.dBody.height << iteam.dBody.weight\
<< strvecfamily;
return input;
}
//反序列化
friend QDataStream &operator>>(QDataStream& output,People& iteam)
{
QVector<QString> vecfamily;
output >> iteam.age >>iteam.dBody.height >> iteam.dBody.weight >> vecfamily;
iteam.vecfamily = vecfamily.toStdVector();
return output;
}

总之,序列化就是将对象实例的状态转换为可保持或传输的格式的过程,而反序列化是依据流重构对象。

哪些场景下需要?

  • (保持)将对象存储于硬盘上,便于以后反序列化使用
  • (传输)在网络上传送对象的字节序列

字节对齐、大小端对齐

Contents
  1. 1. 为什么要序列化和反序列化?
  2. 2. 哪些场景下需要?
  3. 3. 字节对齐、大小端对齐