2014-09-02 45 views
1

我需要将QVariantMap作为QByteArray序列化,而且似乎正确的方法是通过QDataStream。不过,我这样做很麻烦。我没有收到任何错误,但实际上并没有将任何内容保存到字节数组中。使用QDataStream将QVariantMap序列化为QByteArray

//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。我在这个主题上尝试了一些变体,没有任何变体(除了只是导致错误的变体)。

我做的唯一有所作为的是多个“流< < myMap”行,例如,如果我重复该行三次,则将byteArray设置为“010101”。所以我每次运行“流< < myMap”时,我都会再得到一个“01”。

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

回答

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))) 

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