【问题标题】:boost::serialization to serialize only the keys of a mapboost::serialization 仅序列化地图的键
【发布时间】:2011-07-07 10:29:28
【问题描述】:

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

std::map<int, ComplicatedThing> stuff;

ComplicatedThing 仅通过知道 int 即可推导。我想有效地序列化它。一种方法(不错,但可行)是制作一个键向量并序列化该向量。

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

【问题讨论】:

    标签: c++ stl boost-serialization


    【解决方案1】:

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

    【讨论】:

    • 谢谢。当然,序列化是直截了当的: for(it = v.begin(); it != v.end(); it++) ar & *it;但是在反序列化循环时还不清楚。或者你的意思是 ar & v.size(); for(it = v.begin(); it != v.end(); it++) ar & *it;这样我就可以在加载时建立一个循环?
    • 先把元素的个数一一写入,反序列化
    【解决方案2】:

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

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

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

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

    免责声明

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-09
      • 2011-09-21
      • 2011-05-15
      • 1970-01-01
      • 2011-06-01
      • 2014-11-11
      • 1970-01-01
      相关资源
      最近更新 更多