0

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

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。希望有更简单的路径。

4

2 回答 2

0

如果您想让它看起来不笨拙,请使用范围适配器

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

或者,如果您包含适当的标题,我想您可以将其减少到

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

免责声明

于 2011-07-07T14:49:58.330 回答
0

您可以将其序列化为ints 列表(我不是指std::list),而不是将其序列化为容器(地图或矢量)。首先写入元素的数量,然后一个一个地写入,相应地反序列化。这是 10 分钟的任务。如果您在很多地方都需要此解决方案,请将 map 包装在您的类中并为其定义序列化

于 2011-07-07T14:10:52.670 回答