【问题标题】:How to serialize custom objects如何序列化自定义对象
【发布时间】:2014-03-03 05:48:08
【问题描述】:

我在尝试在磁盘上序列化我的对象时遇到问题。这是一个简化的场景:

我让 ObjectA 提供自己的序列化运算符。它们可以工作,因为我可以将数据保存/加载到文件中。 接下来我有 ObjectB 包含 ObjectA 作为数据成员。尝试保存 ObjectB 时出现运行时错误:

QVariant::save: 无法保存类型 279。

我正在将此代码用于流操作符:

QDataStream & operator<<( QDataStream & dataStream, const ObjectA & objectA )
{
    for(int i=0; i< objectA.metaObject()->propertyCount(); ++i) {
        if(objectA.metaObject()->property(i).isStored(&objectA)) {
            dataStream << objectA.metaObject()->property(i).read(&objectA);
        }
    }
    return dataStream;
}

QDataStream & operator>>(QDataStream & dataStream, ObjectA & objectA) {
    QVariant var;
    for(int i=0; i < objectA.metaObject()->propertyCount(); ++i) {
        if(objectA.metaObject()->property(i).isStored(&objectA)) {
            dataStream >> var;
            objectA.metaObject()->property(i).write(&objectA, var);
        }
    }

    return dataStream;
}

(对于 ObjectB 运算符,只需将 A 替换为 B)

我认为错误是在 ObjectB 序列化实现中,但我不知道如何进行。

【问题讨论】:

  • 您是否尝试使用qRegisterMetaTypeStreamOperators 注册您的流操作符?
  • 谢谢 thuga,qRegisterMetaTypeStreamOperators 是缺失的部分。一个附带问题:使用十六进制编辑器分析保存的文件我注意到它包含字符串 ObjectA: 是正常的吗?
  • 如果您将属性转储到调试输出中,我相信您会得到答案 :)

标签: qt serialization qdatastream


【解决方案1】:

你必须在你的类型上qRegisterMetaTypeStreamOperators。例如:

class MyType {
  ...
};
Q_REGISTER_METATYPE(MyType);

int main(int argc, char ** argv) {
  ...
  qRegisterMetaTypeStreamOperators<MyType>();
  ...
}

在 Qt 6 中不再需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多