我正在尝试序列化qhash对象并将其存储在qbytearray中(使用qdpsocket或qtcsocket发送)。
我目前的尝试是这样的:

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

最佳答案

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

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

最后一种方法(以及一些更下游的方法)尝试从数据流中读取数据,将其内容转换为QVariant以便在qDebug中显示。换句话说,您的实际代码是正确的;调试检查导致了失败。
您可以使用如下内容检查字节数组的内容:
qDebug() << ba.length() << ba.toHex();

07-25 22:08