2014-11-26 4 views
0

У меня есть QVariant, который может содержать double, QString, объект Foo или что-то еще.Qt Json serialization

Я хотел бы сериализовать свой QVariant, не зная, что он содержит. Я пытаюсь сделать сериализации вроде этого:

QJsonObject jsonObject; 
jsonObject["myObject"] = _variant.toJsonObject(); 

Какую функцию я должен перегружать в Foo? Должен ли я использовать Q_PROPERTY?

ответ

2

Я не верю, что вы можете делать то, что хотите напрямую. Невозможно преобразовать произвольный объект, например Foo, в QJsonObject, за исключением того, что вручную считывают и записывают соответствующие поля объекта Foo. Поскольку QVariant не знает, что ваш объект поддерживает эту функциональность, вы не сможете напрямую использовать QVariant. Это может помочь вам последовать примеру предоставленный Qt для выполнения сериализации:

http://doc.qt.io/qt-5/qtcore-json-savegame-example.html

Обратите внимание, что они имеют ручной read и write методы для Game объекта.

+0

Связь нарушена, то теперь: http://doc.qt.io/qt-5/qtcore- json-savegame-example.html –

+1

@PatrizioBekerle: обновлено. – b4hand

2

По this вы должны быть в состоянии превратить любой QVariant в QJSonObject

Теперь ваш вопрос стал: как превратить ваш класс Foo в QVariant?

Предлагаю вам добавить toQVariant и fromQVariant методы в класс Foo, чтобы инкапсулировать это поведение; самый удобный класс QVariant фактически QVariantMap, которые вы можете использовать, как это сериализовать объект Foo

QVariant toVariant(Foo song) { 
    QVariantMap map; 
    map.insert("album", wstring2Utf8(song.album())); 
    map.insert("artist", wstring2Utf8(song.artist())); 
    map.insert("duration", song.duration()); 
    map.insert("fingerprint", wstring2Utf8(song.fingerprint())); 
    map.insert("genre", wstring2Utf8(song.genre())); 
    map.insert("title", wstring2Utf8(song.title())); 
    map.insert("year", song.year()); 
    return map; 
}