2

このトピックでは、ブーストのシリアル化について説明します。

ポリモーフィック オブジェクトをシリアル化すると、true_type (つまり、オブジェクトの具体的な型) が this_type (つまり、シリアル化されたオブジェクトの型) と等しくない場合にのみ、アーカイブは true_type に関する情報を格納します。

つまり、シリアライズされたオブジェクトのタイプは、基本クラスからシリアライズされた場合にのみ保存されます。

アーカイブに常にタイプを保存させるにはどうすればよいですか?

サンプルで説明しましょう。上記のテキストがそれほど明白かどうかはわかりません...:

2 つのクラスをシリアライズ可能にしましょう。

class Base { ... };
class Leaf : public Base { ... };

私が行った場合 :

std::stringstream ios(std::ios_base::binary | std::ios_base::out | std::ios_base::in);

Base* b = new Leaf();
boost::archive::text_oarchive ar(ios);
ar & b;

次に、アーカイブには次が含まれます。

22 シリアル化::アーカイブ 9 0 4リーフ1 0 0 0 0 0 0 0 0

リーフの具象型情報が含まれています。

しかし、もしそうなら:

Leaf* b = new Leaf();
boost::archive::text_oarchive ar(ios);
ar & b;

次に、アーカイブには次が含まれます。

22 シリアル化::アーカイブ 9 0 1 0 0 0 0 0 0 0

リーフ タイプの情報は含まれません。

すべてのタイプが true_typeアーカイブを作成するにはどうすればよいですか?

私は2つの方法を検索します:-アーカイブタイプ(register_type、save_pointer、...)のメソッドの呼び出しに失敗しました-boost/archive/detail/oserializer.hppファイルを直接変更します:構造体ポリモーフィック、関数テンプレートで static void save(Archive &ar , T & t) コメントアウト

if(*this_type == *true_type){
    const basic_pointer_oserializer * bpos = register_type(ar, t);
    ar.save_pointer(vp, bpos);
    return;
}

失敗しました。

ご協力ありがとう御座います。

ニコラス。

PS:なぜ私がそれをやろうとしているのかについて一言。true_type が「登録済み」の場合 (register が適切な単語かどうかはわかりません)、オブジェクトを任意の基本クラスに逆シリアル化できます。例:

//SERIALIZATION:
Leaf* leaf = new Leaf();
ar & leaf;

//DESERIALIZATION:
Base* b = 0;
ar & b; // would work only if Leaf has been saved in the archive as true_type

マルチチーム プロジェクトのツールの場合、それは非常に強力です。テスト用のデータはチームによってシリアル化されており、他のチームはインターフェイス クラス IImage に逆シリアル化することができます。 、AImage2D、Image2DRGB、Image2DRAW など。

4

0 に答える 0