我有一个 QVariant 可以包含 a double
、 a QString
、一个Foo
对象或任何东西。
我想在QVariant
不知道它包含什么的情况下序列化我的。我正在尝试像这样进行序列化:
QJsonObject jsonObject;
jsonObject["myObject"] = _variant.toJsonObject();
我必须重载什么功能Foo
?我必须使用Q_PROPERTY
吗?
我有一个 QVariant 可以包含 a double
、 a QString
、一个Foo
对象或任何东西。
我想在QVariant
不知道它包含什么的情况下序列化我的。我正在尝试像这样进行序列化:
QJsonObject jsonObject;
jsonObject["myObject"] = _variant.toJsonObject();
我必须重载什么功能Foo
?我必须使用Q_PROPERTY
吗?
我不相信你可以直接做你想做的事。除了手动读取和写入对象的相应字段外,没有办法将任意对象转换Foo
为 a 。由于无法知道您的对象支持该功能,因此您将无法直接使用。它可以帮助您按照 Qt 提供的示例进行序列化:QJsonObject
Foo
QVariant
QVariant
http://doc.qt.io/qt-5/qtcore-json-savegame-example.html
请注意,他们有该对象的手册read
和write
方法。Game
据此,您应该能够将任何 QVariant 转换为 QJSonObject
现在您的问题变成了:如何将您的 Foo 类转换为 QVariant?
我建议你在 Foo 类中添加 toQVariant 和 fromQVariant 方法来封装这种行为;最方便的 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;
}