0

基本クラスと4つの派生クラスがあります。すべての派生クラスを基本クラスのポインター型のベクトルに格納します。最初の初期化中に、コンストラクターを使用して各派生型を異なる方法で作成します。基本的に、それらはそれぞれ、ctorに異なるパラメータタイプを持っています。(BOOST_CLASS_EXPORTをコンパイルするには、保護されたデフォルトのコンストラクターを提供する必要がありましたが、それは別の話です)。これらの派生クラスのすべてのメンバー(ctorに入力)を保存することはできません/できません。

ここで、boost :: serializeを使用してディスクからオブジェクトをロードすると、これらのメンバー(シリアル化されておらず、各派生型に固有)が破棄されます。また、基本クラスのポインターのみを格納しているため、これらの派生型を再初期化する方法を考えることはできません。

正確に必要なのは、すべてのコンテンツを削除せずに、派生型(ポインター)を部分的にロードできることです。

これを克服する方法はありますか、魔法のブースト定義または関数呼び出しはおそらくありますか?そうでなければ、boost :: serializeを使用したポリモーフィズムはまったく不可能です。何かが足りないはずであり、問​​題を十分に定義できることを願っています。

4

1 に答える 1

0

シリアル化のためだけにデフォルトのコンストラクターを作成する必要はありません。代わりに、デフォルト以外のコンストラクターに必要なデータをブースト保存/ロードし、それを使用してロード時に新しいオブジェクトを構築することができます。

そうすれば、データメンバーの有効性を保証するためにコンストラクターが行うことはすべて、シリアル化中にも発生する可能性があり、シリアル化ライブラリはオブジェクトのデータメンバーを直接操作する必要はありません。これにより、データ消去を防ぐことができます。

たとえば、クラスがanameとaを使用して構築できる場合size、次のように関数をオーバーロードできます。

template <class Archive>
inline void save_construct_data(Archive & ar, const my_class * t, const unsigned int) {
    ar << my_class->name();
    ar << my_class->size();
}

template<class Archive>
inline void load_construct_data(Archive & ar, my_class * t, const unsigned int) {
    std::string name;
    int size;
    ar >> name;
    ar >> size;
    ::new(t)my_class(name, size); // placement 'new' using your regular constructor
}

こちらのドキュメントをご覧ください。

于 2011-02-09T22:06:59.613 に答える