通过QDataStream序列化QVariant

Lex*_*Lex 6 c++ serialization qt qvariant

我可能写错了,但这是我正在尝试执行的代码并且它无法执行预期的操作:

#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;
}
Run Code Online (Sandbox Code Playgroud)

给出QVariant类文档中的示例:

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

它应该正确地将值123序列化到QByteArray但不这样做,而是只写出:

test: 
Run Code Online (Sandbox Code Playgroud)

任何人都知道如何解决这个问题?

编辑

好吧,也许不清楚,但这是原始问题:

我可能有任何存储在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;
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*urn 4

QDataStream不写入文本,而是以此处指定的形式写入二进制数据。因此,您不应期望在字节数组中看到任何可打印字符,当然也不会看到数字的字符串表示形式。

QTextStream用于写出文本,但它不直接与QVariant. 您需要编写自己的代码来测试变体包含的类型并写出适当的字符串。