Возможно, я пишу это неправильно, но вот код, который я пытаюсь выполнить, и это не удается
делать то, что ожидается:
#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;
}
QDataStream
не пишет текст, он записывает двоичные данные в указанной форме Вот. Таким образом, вы не должны ожидать появления печатных символов в байтовом массиве и, конечно, не строкового представления числа.
QTextStream
используется для записи текста, однако он не совместим напрямую с QVariant
, Вам нужно написать собственный код, чтобы проверить, какой тип содержит вариант, и вывести соответствующую строку.
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 );
печатать байты из потока, хранящегося в порядке с прямым порядком байтов.