用自己的类序列化QHash?

时间:2015-10-26 09:18:18

标签: c++ serialization qt5 qhash qdatastream

我有一个QHash<const QString id, MyClass>,而MyClass只是一些带有getter和setter的QString quint8值的集合。 MyClass还覆盖了QDataStream &operator<<(QDataStream &ds, const MyClass &obj)

要序列化我使用:

typedef QHash<const QString, MyClass> MyClassHash;
//..
QDataStream &operator<<(QDataStream &ds, const MyClassHash &obj) {

    QHashIterator<const QString, MyClass> i(obj);

    while(i.hasNext())
    {
        i.next();
        QString cKey = i.key();
        ds << cKey << i.value();
    }

    return ds;
}

现在,我对另一方感到困惑:

QDataStream &operator>>(QDataStream &ds, MyClassHash &obj) {
    obj.clear();

    // ?    

    return ds;
}

我是否知道该序列化QHash的广泛性?

3 个答案:

答案 0 :(得分:1)

找到QDataStream::status

QDataStream &operator>>(QDataStream &ds, MyClassHash &obj) {
  obj.clear(); // clear possible items

  Myclass cMyCls;

  while (!ds.status()) { // while not finished or corrupted
    ds >> cKey >> cMyCls;
    if (!cKey.isEmpty()) { // prohibits the last empty one
      obj.insert(cKey, cMyCls);
    }
  } 

  return ds;
}

答案 1 :(得分:1)

为QHash提供operator<<operator>>; Qt。已经为您提供了它们的实现。

只要您的密钥类型和值类型都可以使用QDataStream进行序列化,那么您就可以了:

class MyClass
{
    int i;
    friend QDataStream &operator<<(QDataStream &ds, const MyClass &c);
    friend QDataStream &operator>>(QDataStream &ds, MyClass &c);
};

QDataStream &operator<<(QDataStream &ds, const MyClass &c)
{
    ds << c.i;
    return ds;
}
QDataStream &operator>>(QDataStream &ds, MyClass &c)
{
    ds >> c.i;
    return ds;
}

int main() 
{
    QHash<QString, MyClass> hash;
    QDataStream ds;
    // doesn't do anything useful, but it compiles, showing you
    // that you don't need any custom streaming operators
    // for QHash
    ds << hash;
    ds >> hash;
}

答案 2 :(得分:0)

显然,有两种方法可以做:

  1. 在保存QHash项目之前的operator<<中,您应该保存QHash :: size
  2. operator<<结尾处保存一些无效的QString,例如空的QString,在operator>>中,当我们遇到这样的值时停止阅读。