boost :: serialization для сериализации только ключей карты - PullRequest
0 голосов
/ 07 июля 2011

У меня есть класс с картой, и я хочу сериализовать класс с помощью boost serialize.

std::map<int, ComplicatedThing> stuff;

ComplicatedThing можно получить, просто зная int.Я хочу сериализовать это эффективно.Один из способов (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 / collection_load_imp.hpp.Надеюсь, есть более простой путь.

Ответы [ 2 ]

0 голосов
/ 07 июля 2011

Если вы хотите, чтобы это не выглядело неуклюже, используйте адаптеры диапазона

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

Или, если вы включите соответствующие заголовки, я думаю, вы могли бы уменьшить это значение до

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

Отказ от ответственности

  • Все это предполагает, что Boost Serialization поставляется с сериализаторами для диапазонов повышения (не проверено)
  • Это может не работатьну в двунаправленной настройке serialize (вы хотите прочитать http://www.boost.org/doc/libs/1_46_1/libs/serialization/doc/serialization.html#splitting)
  • Я не перенес вышеизложенное в окрестности компилятора
0 голосов
/ 07 июля 2011

вы можете сериализовать его как список int s (я не имею в виду std::list) вместо того, чтобы сериализовать его как контейнер (карту или вектор).Сначала запишите число элементов, а затем их один за другим, соответственно десериализуйте.это задача 10 минут.если вам нужно это решение во многих местах, оберните карту в своем классе и определите для нее сериализацию

...