将QHash序列化为QByteArray

时间:2010-12-17 15:44:00

标签: qt serialization qt4 tcp udp

我正在尝试序列化QHash对象并将其存储在QByteArray中(使用QUDPSocket或QTCPSocket发送)。

我目前的尝试是这样的:

// main.cpp
#include <QtCore/QCoreApplication>
#include <QHash>
#include <QVariant>
#include <QDebug>

int main(int argc, char *argv[])
{

    QHash<QString,QVariant> hash;
    hash.insert("Key1",1);
    hash.insert("Key2","thing2");

    QByteArray ba;
    QDataStream ds(&ba, QIODevice::WriteOnly);
    ds << hash;
    qDebug() << ds;

}

当这个运行时,我从qDebug()得到了这个:

QIODevice::read: WriteOnly device
QIODevice::read: WriteOnly device
QIODevice::read: WriteOnly device
QVariant(, ) 

documentation表示这应该写入字节数组,但显然这不会发生在这里。我做错了什么?

OS-X上的Qt 4.7.1

谢谢! -J

2 个答案:

答案 0 :(得分:4)

它失败的原因是它试图从只写流中读取。顺序是:

qDebug() << ds;
--> QVariant::QVariant(QDataStream &s)
  --> QDataStream& operator>>(QDataStream &s, QVariant &p)
   --> void QVariant::load(QDataStream &s)

最后一个方法(以及更下游的一些方法)尝试从数据流中读取数据流,将其内容转换为QVariant,以便在qDebug中显示。换句话说,你的实际代码很好;调试检查导致失败。

您可以使用以下内容检查字节数组的内容:

qDebug() << ba.length() << ba.toHex();

答案 1 :(得分:1)

您可以像以下代码一样实施程序:

QHash<QString,QVariant> options;
options["string"] = "my string";
options["bool"] = true;

QByteArray ar;

//Serializing
QDataStream out(&ar,QIODevice::WriteOnly);   // write the data
out << options;

//setting a new value
options["string"] = "new string";

//Deserializing
// read the data serialized from the file
QDataStream in(&ar,QIODevice::ReadOnly);   
in >> options;

qDebug() << "value: " << options.value("string");

ref