Сериализация QHash в QByteArray - PullRequest
       12

Сериализация QHash в QByteArray

4 голосов
/ 17 декабря 2010

Я пытаюсь сериализовать объект 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(, ) 

Документация говорит, что это должно записывать в байтовый массив, но, очевидно, здесь этого не происходит. Что я делаю не так?

Qt 4.7.1 в OS-X

Спасибо! -J

Ответы [ 2 ]

4 голосов
/ 17 декабря 2010

Причиной сбоя является то, что он пытается читать из потока только для записи.Последовательность:

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 голос
/ 20 июня 2012

Вы можете реализовать свою программу, как этот код:

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

исх

...