4

I have a problem trying to serialize on disk my objects. This is a simplified scenario:

I have ObjectA providing its own serialization operators. They work since I can save/load data to file. Next I have ObjectB containing ObjectA as data member. Trying to save ObjectB I got a runtime error:

QVariant::save: unable to save type 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)

I think that the error is in ObjectB serialization implementation, but I dunno how to proceed.

Kuba hasn't forgotten Monica
  • 88,505
  • 13
  • 129
  • 275
bullet
  • 57
  • 7
  • 3
    Did you try to register your stream operators with [`qRegisterMetaTypeStreamOperators`](http://qt-project.org/doc/qt-5.0/qtcore/qmetatype.html#qRegisterMetaTypeStreamOperators)? – thuga Feb 06 '14 at 12:34
  • Thank you thuga, qRegisterMetaTypeStreamOperators was the missing part. A side question: analizing the saved file with an hex editor I noticed that it contains the string ObjectA: is that normal? – bullet Feb 06 '14 at 14:16
  • I'm sure you'll have your answer if you dump the properties to a debug output :) – Kuba hasn't forgotten Monica Feb 06 '14 at 14:25

1 Answers1

1

You must qRegisterMetaTypeStreamOperators on your type. E.g:

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

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

It is no longer necessary in Qt 6.

Kuba hasn't forgotten Monica
  • 88,505
  • 13
  • 129
  • 275