我需要将 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 << myMap”行,例如,如果我重复该行三次,它将 byteArray 设置为“010101”。因此,每次我运行“stream << myMap”时,我都会多得到一个“01”。
我担心我可能只是读取了错误的代码,而写入却很好,这就是为什么我添加了调试行来检查十六进制代码,并明确指出存在写入错误。
最佳答案
您的代码中有错误。您发送到您的byteArray
的内容不是QVariantMap
,它是一个指向 QVariantMap
的指针。这只是将地址发送到数组而不是 map 数据。此更改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) ) )
请注意,我已在实现中删除了指针。我确实更喜欢尽可能使用作用域变量,并建议您这样做。这是一种获取和释放资源的简单方法,可以让您免于破坏。
关于c++ - 使用 QDataStream 将 QVariantMap 序列化为 QByteArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25614907/