【问题标题】:Serialize QVariantMap as QByteArray with QDataStream使用 QDataStream 将 QVariantMap 序列化为 QByteArray
【发布时间】:2014-09-02 02:11:09
【问题描述】:

我需要将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

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

【问题讨论】:

    标签: c++ qt serialization


    【解决方案1】:

    您的代码中有错误。您发送给byteArray 的不是QVariantMap,而是指向QVariantMap 的指针。这只是向数组发送地址而不是地图数据。此更改 stream &lt;&lt; (*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) ) ) 
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-15
      • 2014-06-09
      • 2015-11-17
      • 2020-07-10
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      相关资源
      最近更新 更多