QT自带的序列化和反序列化库
时间: 2024-05-07 08:13:44 浏览: 16
QT自带的序列化和反序列化库是Qt的核心模块之一,用于将对象转换为字节流以便于存储或传输,并且可以将字节流还原为原始对象。Qt提供了两个主要的序列化和反序列化类:QDataStream和QJsonDocument。
1. QDataStream:
QDataStream是Qt提供的二进制序列化和反序列化类,可以将对象以二进制形式进行序列化和反序列化。它支持多种数据类型的序列化,包括基本数据类型、Qt容器类、自定义类等。使用QDataStream进行序列化和反序列化的步骤如下:
- 创建一个QDataStream对象,并指定要进行序列化或反序列化的设备(如文件、套接字等)。
- 使用<<操作符将对象写入QDataStream中进行序列化,或使用>>操作符从QDataStream中读取对象进行反序列化。
2. QJsonDocument:
QJsonDocument是Qt提供的JSON序列化和反序列化类,可以将对象以JSON格式进行序列化和反序列化。它支持将Qt的基本数据类型、容器类、自定义类等转换为JSON字符串,并可以将JSON字符串还原为原始对象。使用QJsonDocument进行序列化和反序列化的步骤如下:
- 创建一个QJsonDocument对象,并使用QJsonObject或QJsonArray构建JSON数据结构。
- 调用toJson()函数将JSON数据结构转换为JSON字符串进行序列化,或调用fromJson()函数将JSON字符串转换为JSON数据结构进行反序列化。
相关问题
qt序列化和反序列化
在Qt中,可以使用QDataStream类来进行对象的序列化和反序列化操作。QDataStream提供了一种便捷的方式来将对象以二进制的形式存储在文件中或通过网络传输。
首先,我们需要创建一个QByteArray对象来存储序列化后的数据。可以将其视为一个设备,因为Qt在内部使用QBuffer设备来包装QByteArray。接下来,我们创建一个QDataStream对象,并将其与QByteArray设备关联起来。然后,我们可以使用QDataStream的<<运算符来将对象写入到QByteArray中,并使用>>运算符来从QByteArray中读取对象。
示例代码如下所示:
```cpp
QByteArray data; // 创建一个用于存储序列化数据的QByteArray对象
QDataStream stream(&data, QIODevice::ReadWrite); // 创建一个与QByteArray设备关联的QDataStream对象
MyObject obj; // 假设我们有一个名为MyObject的自定义类
// 序列化对象
stream << obj; // 将对象写入到QByteArray中
// 反序列化对象
MyObject newObj;
stream >> newObj; // 从QByteArray中读取对象
```
在上述示例中,我们创建了一个QByteArray对象名为data来存储序列化数据。然后,我们创建了一个QDataStream对象stream,并将其与QByteArray设备关联起来。接下来,我们可以使用stream的<<运算符将对象obj写入到QByteArray中。最后,我们使用>>运算符从QByteArray中读取对象,并将其存储在newObj变量中。
这样,我们就完成了Qt中的序列化和反序列化操作。可以根据实际情况调整代码以满足具体要求。
: 序列化可以使对象或数据结构更方便地在网络上传输或者保存在本地文件中,反序列化可以快速地复原原有对象和数据结构,方便使用。你总不可能一个字节一个字节的输入吧。
: 关于后两个构造函数,虽然 QByteArray 类并不是 QIODevice 类的子类,但是感性上我们可以把 QByteArray a 当成一个设备。因为 Qt 在内部已经使用 QBuffer 这个设备包装了 QByteArray,可以看源码来证实,如下图。
用QT实现序列化和反序列化
序列化和反序列化是将对象或数据转换为字节流或文本格式以便于存储或传输的过程。在QT中,可以使用QDataStream类实现序列化和反序列化。
序列化:
1. 创建一个QByteArray对象,用于存储序列化后的数据。
2. 创建一个QDataStream对象,并设置设备为QIODevice::WriteOnly,将QByteArray对象作为设备。
3. 使用QDataStream对象的<<运算符将要序列化的数据写入QByteArray对象中。
4. 关闭QDataStream对象。
反序列化:
1. 创建一个QDataStream对象,并设置设备为QIODevice::ReadOnly,将包含序列化数据的QByteArray对象作为设备。
2. 使用QDataStream对象的>>运算符将序列化的数据读取到相应的变量中。
3. 关闭QDataStream对象。
示例代码:
//序列化
QByteArray byteArray;
QDataStream out(&byteArray, QIODevice::WriteOnly);
out << QString("Hello World");
out << 123;
out << 3.14;
out << QVector<int>{1,2,3};
out.device()->seek(0); //重置设备指针
qDebug() << byteArray.toHex(); //输出序列化后的字节流
//反序列化
QByteArray byteArray2 = QByteArray::fromHex("0000000b48656c6c6f20576f726c64007b000000fb4048f5c3");
QDataStream in(&byteArray2, QIODevice::ReadOnly);
QString str;
int i;
double d;
QVector<int> vec;
in >> str;
in >> i;
in >> d;
in >> vec;
qDebug() << str << i << d << vec; //输出反序列化后的数据