Boost::serialization只序列化映射的键

boost::serialization to serialize only the keys of a map

本文关键字:映射 serialization Boost 序列化      更新时间:2023-10-16

我有一个带有map的类,我想使用boost serialize序列化这个类。

std::map<int, ComplicatedThing> stuff;

complexatedthing只要知道整型就可以推导。我想有效地序列化它。一种方法(讨厌,但有效)是创建键的向量并对该向量进行序列化。

// 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;
}

但这是不优雅的。使用BOOstrongERIALIZATION_SPLIT_MEMBER()和load/save方法,我认为我应该能够完全跳过中间向量的分配。我被困在那里。

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

您可以将其序列化为int s列表(我不是指std::list),而不是将其序列化为容器(映射或向量)。首先写入若干个元素,然后逐个进行反序列化。这是一个10分钟的任务。如果在很多地方都需要此解决方案,请将map封装在类中并为其定义序列化

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

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

或者如果你包含适当的标题,我想你可以把它减少到

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

免责声明

  • 所有这些都假设Boost序列化附带Boost范围的序列化器(未检查)
  • 这可能不能很好地在双向serialize设置(你会想要阅读http://www.boost.org/doc/libs/1_46_1/libs/serialization/doc/serialization.html#splitting)
  • 我没有把上面的代码放到编译器
  • 的附近