c++ - 使用 QDataStream 将 QVariantMap 序列化为 QByteArray

标签 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 << 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/

相关文章:

c++ - 使用 g++ 5.3.1 编译的程序运行速度比使用 g++ 4.8.4 编译的相同程序慢 3 倍,相同的命令

c++ - 在 C++ 中从 .txt 文件读取到二维数组

c++ - C++模板特化/部分和全部

python - 如何阻止 QTreeWidget 移动滚动位置?

c++ - 如何避免序列化器和容器序列化器之间的循环模板依赖?

php - 如何将 x-number HTML 格式的项目添加到我的页面?

c# - 序列化属性,但不要反序列化 Json.Net 中的属性

c++ - 如何使用 antlr 2.7 编写简单的 Lexer/Parser?

python - PyQt4 登录后立即启动系统托盘图标

c++ - Qt - 未发出有关成员更改的 Q_PROPERTY NOTIFY 信号