0

マップ付きのクラスがあり、boostserializeを使用してクラスをシリアル化したい。

std::map<int, ComplicatedThing> stuff;

ComplicatedThingは、intを知るだけで導出できます。これを効率的にシリアル化したい。1つの方法(うまくいきますが、機能します)は、キーのベクトルを作成し、そのベクトルをシリアル化することです。

// illustrative, not test-compiled
std::vector<int> v;
std::copy(stuff.begin, stuff.end, std::back_inserter(v));
// or
for(std::vector<int> it = v.begin(); it != v.end(); it++)
    stuff[*it] = ComplicatedThing(*it);

// ...and later, at serialize/deserialize time
template<class Archive>
void srd::leaf::serialize(Archive &ar, const unsigned int version)
{
    ar & v;
}

しかし、これはエレガントではありません。BOOST_SERIALIZATION_SPLIT_MEMBER()とload / saveメソッドを使用すると、中間ベクトルの割り当てを完全にスキップできるはずです。そしてそこで私は立ち往生しています。

おそらく私の答えは、boost / serialization/collections_load_imp.hppを理解することにあります。うまくいけば、もっと簡単な道があります。

4

2 に答える 2

0

不器用に見えないようにしたい場合は、レンジアダプターを使用してください

 ar & (stuff | transformed(boost::bind(&map_type::value_type::first, _1));

または、適切なヘッダーを含めると、これを次のように減らすことができると思います。

 ar & (stuff | transformed(&map_type::value_type::first))

免責事項

  • これはすべて、BoostSerializationがBoostRanges用のシリアライザーとともに出荷されることを前提としています(チェックされていません)
  • これは双方向設定ではうまく機能しない可能性があります( http://www.boost.org/doc/libs/1_46_1/libs/serialization/doc/serialization.html#splittingserializeを読むことをお勧めします)
  • 私は上記をコンパイラの近くに持ってきていません
于 2011-07-07T14:49:58.330 に答える
0

コンテナ(マップまたはベクトル)としてシリアル化する代わりに、sのリストint(私は意味しません)としてシリアル化できます。std::list最初に要素の数を書き込み、次にそれらを1つずつ書き込み、それに応じて脱セリゼーションします。それは10分のタスクです。多くの場所でこのソリューションが必要な場合は、クラスでマップをラップし、そのシリアル化を定義します

于 2011-07-07T14:10:52.670 に答える