用Qt序列化

Nar*_*rek 49 c++ serialization qt qt4

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

"MyType"是一个具有不同类型字段的类.

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

Nar*_*rek 94

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);
Run Code Online (Sandbox Code Playgroud)

这是我们如何实现<<运算符:

QDataStream &operator<<(QDataStream &out, const Painting &painting)
{
    out << painting.title() << painting.artist()
        << quint32(painting.year());
    return out;
}
Run Code Online (Sandbox Code Playgroud)

要输出绘画,我们只输出两个QStrings和一个quint32.在函数结束时,我们返回流.这是一种常见的C++习惯用法,它允许我们使用带有输出流的<<运算符链.例如:

out << painting1 << painting2 << painting3;

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;
}
Run Code Online (Sandbox Code Playgroud)

这来自:Qt 4的C++ GUI编程作者:Jasmin Blanchette,Mark Summerfield