我有一个带有地图的类,我想使用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。希望有一条更简单的道路。
答案 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))
<强>声明强>
serialize
设置中正常运行(您需要阅读http://www.boost.org/doc/libs/1_46_1/libs/serialization/doc/serialization.html#splitting)