2010-11-18 9 views
0

私は基本クラスと4つの派生クラスを持っています。すべての派生クラスを基本クラスのポインタ型のベクトルに格納します。最初の初期化時に、コンストラクタを使用して、それぞれの派生型を別々に作成します。基本的には、それぞれが異なるパラメータタイプを持っています。 (私はBOOST_CLASS_EXPORTをコンパイルするために保護されたデフォルトのctorを用意しなければならなかったが、これは別の話だ)。私はこれらの派生クラスのすべてのメンバー(ctorで記入)を保存できません。boost :: serialization多型の初期化

boost :: serializeを使用してディスクからオブジェクトをロードすると、これらのメンバー(シリアル化されておらず、各派生型に固有のメンバー)が破棄されます。そして、私は基本クラスのポインタだけを格納するので、これらの派生型を再初期化する方法は考えられません。すべてのコンテンツを削除することなく、部分的に私の派生型(ポインタ)をロードできることです正確に何が必要

..

はこれを克服するための方法、マジックブースト定義または関数呼び出し、おそらくありますか?それ以外の場合は、boost :: serializeを使った多態性はまったくできません。私は何かを見逃してしまい、私の問題を十分に定義できたらいいと思います。

答えて

0

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

このようにして、シリアライズ時にデータメンバーの有効性を保証するためにコンストラクタがどのような処理を行っても、シリアル化ライブラリはオブジェクトのデータメンバーを直接操作する必要はありません。これにより、データの消去が防止されます。たとえば、次のように

、あなたのクラスはnamesizeを用いて構築することができるならば、あなたは関数をオーバーロードすることができます:

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 
} 

は、ドキュメントhereをチェックしてください。

関連する問題