使用 Qt 进行序列化

Posted

技术标签:

【中文标题】使用 Qt 进行序列化【英文标题】:Serialization with Qt 【发布时间】:2011-02-03 23:14:31 【问题描述】:

我正在使用 Qt 库编写 GUI。在我的 GUI 中,我有一个巨大的 std::map。

“MyType”是一个具有不同类型字段的类。

我想序列化 std::map。我怎样才能做到这一点? Qt 是否为我们提供了必要的功能?

【问题讨论】:

【参考方案1】:

QDataStream 处理各种 C++ 和 Qt 数据类型。完整列表可在http://doc.qt.io/qt-4.8/datastreamformat.html 获得。我们还可以通过重载 > 运算符来添加对我们自己的自定义类型的支持。这是可以与 QDataStream 一起使用的自定义数据类型的定义:

class Painting

public:
    Painting()  myYear = 0; 
    Painting(const QString &title, const QString &artist, int year) 
        myTitle = title;
        myArtist = artist;
        myYear = year;
    
    void setTitle(const QString &title)  myTitle = title; 
    QString title() const  return myTitle; 
    ...
private:
    QString myTitle;
    QString myArtist;
    int myYear;
;
QDataStream &operator<<(QDataStream &out, const Painting &painting);
QDataStream &operator>>(QDataStream &in, Painting &painting);

下面是我们如何实现

QDataStream &operator<<(QDataStream &out, const Painting &painting)

    out << painting.title() << painting.artist()
        << quint32(painting.year());
    return out;

要输出绘画,我们只需输出两个 QString 和一个 quint32。在函数结束时,我们返回流。这是一个常见的 C++ 习惯用法,它允许我们将

operator>>()的实现类似于operator

QDataStream &operator>>(QDataStream &in, Painting &painting)

    QString title;
    QString artist;
    quint32 year;
    in >> title >> artist >> year;
    painting = Painting(title, artist, year);
    return in;

来自:C++ GUI Programming with Qt 4 作者 Jasmin Blanchette, Mark Summerfield

【讨论】:

令我惊讶的是支持的类型列表不完整:它可能只引用了跨平台或稳定序列化的类型。例如QSet 未在此处列出。 QGeoCoordinate 是另一个例子。

以上是关于使用 Qt 进行序列化的主要内容,如果未能解决你的问题,请参考以下文章

Qt中 使用Json 对自定义对象进行序列与反序列化 之一

Qt持久性对象进行序列化

Qt持久性对象进行序列化(同时比较了MFC与Java的方法)

qt c ++中反序列化地图的大小增加

序列化 JSON 数据 Qt

如何注册一个类以在 Qt 的 QWebChannel 信号中使用它