使用QDataStream将QVariantMap序列化为QByteArray

时间:2014-09-02 02:11:09

标签: c++ qt serialization

我需要将QVariantMap序列化为QByteArray,而这似乎是通过QDataStream执行此操作的合适方式。但是,我在这方面遇到了很多麻烦。我没有收到任何错误,但实际上并没有将任何内容保存到字节数组中。

//Create a QVariantMap that has a key value pair
QVariantMap *myMap = new QVariantMap();
myMap->insert("MyKey","the value for MyKey");

// Serialize it to a QBiteArray using a QDataStream object
QByteArray byteArray;
QDataStream stream(&byteArray, QIODevice::WriteOnly);
//qDebug() << byteArray.toHex();  ==> "" (because byteArray is empty)
stream << myMap;
//qDebug() << byteArray.toHex(); ==> "01" (regardless of what the key/value/etc. was, it's always 01)
//Test whether I can read it out
QVariantMap inMap;
QDataStream inStream(&byteArray, QIODevice::ReadOnly);
instream >> inMap;
//qDebug() << inMap.keys();  ==> () (No keys are in the map)

所以没有错误或明显的失败,但它实际上并没有将任何值(除了01 - 大小?)放入ByteArray。我已经尝试了很多关于这个主题的变体,没有任何不同的结果(除了只会导致错误的变体)。

我唯一能做的就是产生差异的是多个“stream&lt;&lt; myMap”行,例如,如果我重复三次,则将byteArray设置为“010101”。所以每次我运行“stream&lt;&lt; myMap”时,我再得到一个“01”。

我担心我可能只有不正确的读取代码并且写入很好,这就是为什么我添加了检查十六进制代码的调试行,并清楚地表明存在写入错误。

1 个答案:

答案 0 :(得分:2)

您的代码中存在错误。您发送给byteArray的内容不是QVariantMap,而是指向QVariantMap的指针。这只是向数组发送地址而不是地图数据。此更改stream << (*myMap);应该适合您。

遵循一个工作示例:

QVariantMap myMap, inMap;
QByteArray mapData;

myMap.insert("Hello", 25);
myMap.insert("World", 20);

QDataStream outStream(&mapData, QIODevice::WriteOnly);
outStream << myMap;
qDebug() << myMap;
QDataStream inStream(&mapData, QIODevice::ReadOnly);
inStream >> inMap;
qDebug() << inMap;

<强>输出

QMap(("Hello", QVariant(int, 25) ) ( "World" ,  QVariant(int, 20) ) ) 
QMap(("Hello", QVariant(int, 25) ) ( "World" ,  QVariant(int, 20) ) ) 

请注意,我已在我的实现中删除了指针。我确实更喜欢尽可能使用范围变量,并建议您这样做。这是一种获取和释放资源的简便方法,可以帮助您免受破坏的需要。