我可能写错了,但这是我正在尝试执行的代码,但它失败了 做预期的事情:
#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;
}
答案 0 :(得分:4)
QDataStream
不写文本,它以指定的here格式写入二进制数据。所以你不应该期望在字节数组中看到任何可打印的字符,当然也不是数字的字符串表示。
QTextStream
用于写出文字,但它与QVariant
不直接兼容。您需要编写自己的代码来测试变体包含的类型,并写出相应的字符串。
答案 1 :(得分:3)
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字符你仍然可以从原始内存中打印这个QByteArray。你会这样做的:
const char *dataPtr = data.operator const char *();
int i=0;
while (i<9) {
std::cout << "[" << *dataPtr << "]";
++dataPtr;
++i;
}
,输出为: [] [] [] [] [] [] [] [] [<强> {强>
你可能想做`
data.setByteOrder( QDataStream::LittleEndian );
从以小端顺序存储的流中打印字节。