Qt 序列化
一、序列化概念
将对象或数据结构转换为一种可存储或传输的格式的过程,通常这种格式是二进制序列或者文本格式如JSON、XML等。
序列化出来的数据,可通过反序列化得到原本的数据,并且合理的序列化操作,可以包容各种类型的转换。
作用场景:在Qt中,序列化有着广泛的应用,主要包括:
- 数据对象状态保存:持久化数据,将对象的当前状态序列化为文件或数据库记录,以便在程序关闭后仍能恢复这些数据。
- 网络通信:将数据对象序列化为二进制或文本格式,通过网络传输到远程端,远程端再反序列化为对象。
- 跨平台数据交换:不同平台间的应用程序可以通过序列化数据来进行数据交换。
Qt常用方式:
-
QDataStream
-
适用于二进制序列化,处理效率高。
-
常用于文件存储和网络传输。
-
-
QJsonDocument
和QVariant
-
适用于 JSON 格式的序列化,便于调试和跨平台数据交换。
-
常用于配置文件、RESTful API 数据交换。
-
二、序列化和反序列化流程
- Qt中自带有QDataStream类,可实现序列化操作;
- 其中Qt自带的类型,可以直接使用“<<”、“>>” 两个运算符做序列化和反序列化操作,
- 自定义数据结构和类不能直接序列化和反序列化,需要重写操作符函数才能使用。
1.原生数据类型
流程:
- 定义需要序列化的数据
- 创建QDataStream数据流对象,设置容器及其打开方式
- 通过<<和>>写入或读出
//序列化
QFile file("file.dat"); //创建一个文档
file.open(QIODevice::WriteOnly);//打开并只写
QDataStream out(&file); //序列化文档
out << QString("the answer is");//将字符串写入文档中,实际在该文档中为二进制
out << (qint32)42;
//反序列化
QFile file("file.dat");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
QString str;
qint32 a;
in >> str >> a;
2.自定义数据结构或类
流程:
- 自定义一个数据类型CSampleData,重载<<和>>,参数为(QDataStream& in, CSampleData& data)
- 使用流程同上(实例化类对象,创建数据流对象,使用<<和>>进行写入读出)
class QSampleData : public QObject
{
public:
QChunnelData();
virtual ~QChunnelData();
QChunnelData& operator=(const QChunnelData &other);
friend QDataStream& operator>>(QDataStream&, QChunnelData&);
friend QDataStream& operator<<(QDataStream&, QChunnelData&);
//定义的数据成员
int m_nType;
QString m_strName;
};
CSampleData::CSampleData()
{
m_nType = 0;
m_strName = "";
}
CSampleData::~CSampleData()
{
}
CSampleData::operator =(const CSampleData& other)
{
m_nType = other.m_nType;
m_strName = other.m_strName;
return *this;
}
QDataStream& operator>>(QDataStream& in, CSampleData& data)
{
in >> data.m_nType >> data.m_strName;
return in;
}
QDataStream& operator<<(QDataStream& out, CSampleData& data)
{
out << data.m_nType << data.m_strName;
return out;
}