boost :: serialization仅序列化地图的键

时间:2011-07-07 10:29:29

标签: c++ stl boost-serialization

我有一个带有地图的类,我想使用boost serialize序列化该类。

std::map<int, ComplicatedThing> stuff;

只要知道int,就可以推导出ComplicatedThing。我想有效地序列化这个。一种方法(ick,但有效)是制作键的矢量并序列化矢量。

// 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()和加载/保存方法,我想我应该能够完全跳过中间向量的分配。我被卡住了。

也许我的答案在于理解boost / serialization / collections_load_imp.hpp。希望有一条更简单的道路。

2 个答案:

答案 0 :(得分:0)

您可以将其序列化为int的列表(我不是指std::list),而不是将其序列化为容器(地图或矢量)。拳头写出元素的数量,然后逐个编写,相应地进行去激励。这是10分钟的任务。如果您需要在许多地方使用此解决方案,请在您的类中包装地图并为其定义序列化

答案 1 :(得分:0)

如果您想让它看起来不笨拙,请使用range adaptors

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

或者,如果您包含相应的标题,我想您可以将其缩小为

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

<强>声明