2016-08-10 10 views
1

私は完全に未知のオブジェクトをシリアライズできる何かを探してきました。未知のオブジェクトのシリアライズ

serializationのQtにはqvariantのオブジェクトもあります。それはQVariant(つまり、ポインタやポインタサイクルも持つ)に複雑なオブジェクトを渡してそのオブジェクトを直列化できるということですか?

boost::any isn't supported by serializationと思われます。

C++でのリフレクションの欠如のために、私自身の特定の型直列化ルーチンを記述しなければ、これは不可能ですか?

+0

"不明なオブジェクト"とはどういう意味ですか?達成したいことの例を使って質問を編集できますか? – wasthishelpful

+0

@wasthishelpful '未知のオブジェクト'は '未知のオブジェクト'を意味します。あなたが選んだプロジェクトのgithubで見つけることができる任意のタイプのC++オブジェクトです。 – Dean

+0

それは不明ではない、それは未定義で、おそらく宣言されていないかもしれない:)それで、最終的なコードをどのように働かせて、コンパイラの観点からあなたの未知のものが何であるかを理解するための例を尋ねるのだ@ – wasthishelpful

答えて

1

はい、C++にはリフレクションがないため、独自のシリアライゼーションコードを記述することなくこれを行うことはできません。あなたは、ほとんどそれを理解しました。

+0

qvariantをシリアライズするとうまくいきませんか? – Dean

+0

QVariantは異なる型の共用体ですが、カスタム型を使用する場合は、それでもQtにそれを伝える必要があります。このチュートリアルをご覧くださいhttp://www.bogotobogo.com/Qt/Qt5_QVariant_meta_object_system_MetaType.php – jwernerny

0

C++にはリフレクションがありませんが、QObjectsとQt Property Systemの場合は、Qtでリフレクションを制限することができます。

QObjectのすべてのプロパティを直列化および逆シリアル化するコードを書くのはかなり簡単です。 [ヒント:QObjectのすべてのプロパティを取得するメソッドがあります。]ここでのトレードオフは、シリアル化したいものはすべてQObjectでなければならず(QObjectにはコピーコンストラクタはありません)、getterとsetterはプロパティ。いくつかの巧妙なマクロでは、これはコーディングの観点からはあまりにも大きな問題ではありません。

1

QVariantには、の演算子が定義されている限り、すべてのタイプがQDataStreamの演算子で定義されている限り、シリアル化できます。したがって、独自のカスタムタイプの場合は、これらの演算子を適切に配置する必要があります。その後、正常に動作します。

関連する問題