Qt对象序列化是将Qt对象转换为二进制格式或文本格式的过程,以便于在不同系统和程序之间传递和保存对象的状态。Qt对象序列化主要由QDataStream和QJsonDocument两种方式实现。
底层架构
Qt对象序列化的底层架构如下:
+----------------+ +----------------+
| QObject | | QDataStream |
+----------------+ +----------------+
| save() |<---+ | operator<<() |
| load() | | | operator>>() |
| ... | | |----------------|
+----------------+ | | |
| | | +----------------+
| | | | QByteArray |
| | | +----------------+
| | | | ... |
| | | +----------------+
| | |
+----------------+ | |
| Worker |----+ |
+----------------+ |
| save() | |
| load() | |
| ... | |
+----------------+ |
在上述架构图中,QObject是Qt中所有对象的基类,它提供了一些常用的函数,如save()函数和load()函数,用于将对象转换为二进制格式或文本格式,并从二进制格式或文本格式中恢复对象的状态。
QDataStream是Qt中二进制格式的序列化类,它提供了一些常用的函数,如operator<<()函数和operator>>()函数,用于将对象转换为二进制格式,并从二进制格式中恢复对象的状态。QJsonDocument是Qt中JSON格式的序列化类,它提供了一些常用的函数,如toJson()函数和fromJson()函数,用于将对象转换为JSON格式,并从JSON格式中恢复对象的状态。Worker是一个自定义的类,用于演示对象序列化的使用。
可以通过在Worker类中重载save()函数和load()函数来实现对象的序列化和反序列化。即,我们可以在save()函数中使用QDataStream将对象转换为二进制格式,然后在load()函数中使用QDataStream从二进制格式中恢复对象的状态。同样,在save()函数中,我们也可以使用QJsonDocument将对象转换为JSON格式,然后在load()函数中使用QJsonDocument从JSON格式中恢复对象的状态。
除了上述函数之外,QObject还提供了其他一些函数,如metaObject()、objectName()、setProperty()、property()等函数,用于对象的元对象信息、对象的名称、对象属性的设置和获取等操作。
QDataStream还提供了其他一些函数,如setVersion()、version()等函数,用于设置和获取序列化的版本信息。QJsonDocument还提供了其他一些函数,如fromJson()、toVariant()等函数,用于将JSON格式转换为Qt的变量类型。
Qt对象序列化是将Qt对象转换为二进制格式或文本格式的过程,以便于在不同系统和程序之间传递和保存对象的状态。Qt对象序列化主要由QDataStream和QJsonDocument两种方式实现。开发者可以根据需要自行扩展和修改。
下面是一个简单的示例代码,演示如何使用Qt对象序列化将一个自定义的对象转换为二进制格式和JSON格式,并从二进制格式和JSON格式中恢复对象的状态。
#include <QCoreApplication>
#include <QDebug>
#include <QDataStream>
#include <QJsonDocument>
#include <QJsonObject>
class Worker : public QObject
{
Q_OBJECT
public:
Worker(QString name = "", int age = 0) : m_name(name), m_age(age) {}
QString name() const { return m_name; }
void setName(const QString &name) { m_name = name; }
int age() const { return m_age; }
void setAge(int age) { m_age = age; }
void save(QDataStream &stream) const {
stream << m_name << m_age;
}
void load(QDataStream &stream) {
stream >> m_name>> m_age;
}
QJsonObject toJson() const {
QJsonObject obj;
obj["name"] = m_name;
obj["age"] = m_age;
return obj;
}
void fromJson(const QJsonObject &obj) {
m_name = obj["name"].toString();
m_age = obj["age"].toInt();
}
private:
QString m_name;
int m_age;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建一个Worker对象
Worker worker("John Doe", 30);
// 将Worker对象转换为二进制格式
QByteArray binaryData;
QDataStream binaryStream(&binaryData, QIODevice::WriteOnly);
worker.save(binaryStream);
// 从二进制格式中恢复Worker对象
Worker workerFromBinary;
QDataStream binaryStream2(&binaryData, QIODevice::ReadOnly);
workerFromBinary.load(binaryStream2);
// 将Worker对象转换为JSON格式
QJsonObject json = worker.toJson();
QJsonDocument jsonDoc(json);
QByteArray jsonData = jsonDoc.toJson(QJsonDocument::Compact);
// 从JSON格式中恢复Worker对象
QJsonDocument jsonDoc2 = QJsonDocument::fromJson(jsonData);
QJsonObject json2 = jsonDoc2.object();
Worker workerFromJson;
workerFromJson.fromJson(json2);
// 打印Worker对象的信息
qDebug() << "Original worker: " << worker.name() << worker.age();
qDebug() << "Worker from binary: " << workerFromBinary.name() << workerFromBinary.age();
qDebug() << "Worker from JSON: " << workerFromJson.name() << workerFromJson.age();
return a.exec();
}
在上述示例代码中,我们首先创建了一个Worker对象,然后将其分别转换为二进制格式和JSON格式,并从二进制格式和JSON格式中恢复Worker对象。最后,我们打印了原始Worker对象以及从二进制格式和JSON格式中恢复的Worker对象的信息。