Сериализация QVariant через QDataStream

Возможно, я пишу это неправильно, но вот код, который я пытаюсь выполнить, и это не удается
делать то, что ожидается:

#include <QDataStream>
#include <QByteArray>
#include <QVariant>
#include <iostream>int main(){

QByteArray data;
QDataStream ds(&data,QIODevice::WriteOnly);
QVariant v(123);
ds << v;
std::cout <<"test: " <<  data.data() << std::endl; // "test: 123"

return 0;
}

Приведенный пример в документации класса QVariant:

http://qt-project.org/doc/qt-5.1/qtcore/qvariant.html#type

Он должен правильно сериализовать значение 123 в QByteArray, но не делает этого, вместо этого он просто записывает:

test:

У кого-нибудь есть идеи, как это исправить?

РЕДАКТИРОВАТЬ

Ну, может быть, это было не ясно, но вот оригинальная проблема:

Возможно, у меня есть любой встроенный тип QVariant, хранящийся в QVariant, такой как QStringList, QString, double, int и т.д ….

То, что я хочу, — это способ сериализации QVariant в строку и его восстановление без необходимости делать это самостоятельно для каждого типа.
Насколько я знаю, метод QVariant :: toString () не работает со всеми типами, которые принимаются через QVariant, и я думал, что передача через QDataStream может передать мне сериализованную версию QVariant.

РЕДАКТИРОВАТЬ 2

Благодаря ответу piotruś я смог ответить на мою проблему.
Вот программа:

int main(){
QString str;
{
//serialization
QByteArray data;
QDataStream ds(&data,QIODevice::WriteOnly);
QVariant v(123);
ds << v;
data = data.toBase64();
str = QString(data);
cout << str.toStdString() << endl;

}
{
//deserialization
QByteArray data = str.toLatin1();
data = QByteArray::fromBase64(data);
QDataStream ds(&data,QIODevice::ReadOnly);
QVariant v;
ds >> v;
cout << v.toInt() << endl;
}

return 0;
}

6

Решение

QDataStream не пишет текст, он записывает двоичные данные в указанной форме Вот. Таким образом, вы не должны ожидать появления печатных символов в байтовом массиве и, конечно, не строкового представления числа.

QTextStream используется для записи текста, однако он не совместим напрямую с QVariant, Вам нужно написать собственный код, чтобы проверить, какой тип содержит вариант, и вывести соответствующую строку.

4

Другие решения

QByteArray data;
QDataStream dsw(&data,QIODevice::WriteOnly);
QVariant v(123);
dsw << v;

QDataStream dsr(&data,QIODevice::ReadOnly);
QVariant qv;
dsr>>qv;
qDebug()<<qv.toString();

Однако ваши данные 123 записываются в QByteArray уже. Дело в том QByteArray хранится в виде массива char в памяти не покажет вам «123», если вы попытаетесь отладить это, но покажет «{» вместо этого ASCII символ кода 123. Вы все еще можете распечатать этот QByteArray из необработанной памяти. Вы сделаете это так:

const char *dataPtr = data.operator const char *();
int i=0;
while (i<9) {
std::cout << "[" << *dataPtr << "]";
++dataPtr;
++i;
}

и вывод:
[] [] [] [] [] [] [] [] [{]

вы можете захотеть сделать `

data.setByteOrder( QDataStream::LittleEndian );

печатать байты из потока, хранящегося в порядке с прямым порядком байтов.

3

По вопросам рекламы [email protected]