4

質問のタイトルのように、各オアーを指すデータ構造の複雑なネットをシリアル化する必要があり、デフォルトのコンストラクターを持たない可能性のあるクラスで表されます。クラスには通常、ポインタのベクトルまたはペアのベクトルがあります。

sizeof(SomeClass)のメモリを割り当ててから、シリアル化ルーチンで埋めるのは理にかなっていると思いましたが、これにより、文字列に関連する初期化されていないメモリの問題が発生します(resize()が失敗し、おそらく初期化されていない文字列オブジェクトは仕事)。サンプルコードは次のようになります。

friend class boost::serialization::access;

template<class Archive> void save(Archive & ar, const unsigned int version) const
{
        int n;
        ar & vec.size();
        for(int i=0; i<n; i++)
        {
                ar & vec[i];
        }
}

template<class Archive> void load(Archive & ar, const unsigned int version) const
{
        int n;
        ar & n;
        for(int i=0; i<n; i++)
        {
                SomeClass* obj = (SomeClass*)::operator new(sizeof(SomeClass));
                ar & *obj;
                vec.push_back(*obj);
        }
}
4

1 に答える 1

3

これについては、boost::serializationドキュメントの次のセクションで説明しています。

boost::serialization-デフォルト以外のコンストラクタ

基本的にあなたはあなた自身のバージョンを書く必要がありload_construct_dataますsave_construct_data

于 2012-12-19T09:40:16.773 に答える