c++ - 使用 Qt 进行序列化

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

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

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

最佳答案

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

https://stackoverflow.com/questions/2570679/

相关文章:

c++ - 每个类都应该有一个虚拟析构函数吗?

c++ - C中有const吗?

c++ - 调用函数时切换 "transfer of control bypasses initia

c++ - 如何遍历打包的可变参数模板参数列表?

c++ - C++ 中的 vector ::size_type

c++ - 链接上 undefined symbol ___gxx_personality_v0

c++ - 什么时候需要 "typename"关键字?

c++ - 复制 std::vector:更喜欢赋值还是 std::copy?

c++ - 是否有用于检测 C++11x 支持的预处理器指令?

c++ - C 样式字符串作为模板参数?