8

間違って書いている可能性がありますが、実行しようとしているコードは次のとおりで、期待どおりに動作しません。

#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: 

誰でもこれを修正する方法を知っていますか?

編集

まあ、それは明確ではなかったかもしれませんが、元の問題は次のとおりです。

QStringList 、 QString 、 double 、 int などの QVariant に格納されている QVariant 組み込み型がある可能性があります....

私が欲しいのは、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;
}
4

2 に答える 2