2014-02-06 9 views
4

У меня проблема с сериализацией на диске моих объектов. Это упрощенный сценарий:Как сериализовать пользовательские объекты

У меня есть ObjectA, предоставляющий свои собственные операторы сериализации. Они работают, так как я могу сохранять/загружать данные в файл. Далее у меня есть ObjectB, содержащий ObjectA как элемент данных. Пытаясь спасти ObjectB я получил сообщение об ошибке выполнения:

QVariant::save: unable to save type 279.

Я использую этот код для потока 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; 
} 

(просто заменить А с B для операторов ObjectB)

Я думаю, что ошибка в реализации сериализации ObjectB, но я не знаю, как действовать.

+3

Вы пытались зарегистрировать операторы потока с [ 'qRegisterMetaTypeStreamOperators'] (http://qt-project.org/doc/qt-5.0/qtcore/qmetatype.html#qRegisterMetaTypeStreamOperators)? – thuga

+0

Спасибо thuga, qRegisterMetaTypeStreamOperators - недостающая часть. Боковой вопрос: анализируя сохраненный файл с шестнадцатеричным редактором, я заметил, что он содержит строку ObjectA: это нормально? – bullet

+0

Уверен, что у вас будет ваш ответ, если вы сбросите свойства на вывод отладки :) –

ответ

0

Вы должны указать qRegisterMetaTypeStreamOperators на свой тип. Например:

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

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