0
点赞
收藏
分享

微信扫一扫

【Qt初入江湖】Qt 对象序列化 底层架构、原理详细描述

Mhhao 2023-08-13 阅读 57

     

【Qt初入江湖】Qt 对象序列化 底层架构、原理详细描述_数据库

 

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对象的信息。

举报

相关推荐

0 条评论