简体   繁体   English

如何序列化自定义对象

[英]How to serialize custom objects

I have a problem trying to serialize on disk my objects.我在尝试在磁盘上序列化我的对象时遇到问题。 This is a simplified scenario:这是一个简化的场景:

I have ObjectA providing its own serialization operators.我有 ObjectA 提供它自己的序列化操作符。 They work since I can save/load data to file.它们可以工作,因为我可以将数据保存/加载到文件中。 Next I have ObjectB containing ObjectA as data member.接下来,我将 ObjectB 包含 ObjectA 作为数据成员。 Trying to save ObjectB I got a runtime error:尝试保存 ObjectB 时出现运行时错误:

QVariant::save: unable to save type 279. QVariant::save: 无法保存类型 279。

I'm using this code for stream opertors:我将此代码用于流运算符:

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;
}

(just replace A with B for ObjectB operators) (只需将 ObjectB 运算符的 A 替换为 B)

I think that the error is in ObjectB serialization implementation, but I dunno how to proceed.我认为错误出在 ObjectB 序列化实现中,但我不知道如何进行。

You must qRegisterMetaTypeStreamOperators on your type.您必须在您的类型上使用qRegisterMetaTypeStreamOperators Eg:例如:

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

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

It is no longer necessary in Qt 6.在 Qt 6 中不再需要它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM