【问题标题】:How to serialize a boost::ptr_vector using cereal?如何使用谷物序列化 boost::ptr_vector?
【发布时间】:2016-01-20 19:59:52
【问题描述】:

是否可以使用谷物序列化 boost::ptr_vector 实例?如果有,怎么做?

【问题讨论】:

  • 我对@9​​87654322@ 不是很熟悉,但看起来它本质上是std::vector<void*> 的包装。谷物不支持原始指针,因此我认为如果不对谷物进行重大更改或复杂的解决方法,您不太可能能够序列化 ptr_vector

标签: c++ boost cereal


【解决方案1】:

这绝对是可能的。您可以像这样在存档和指针类型上创建外部 save()load() 模板函数:

#include <iostream>
#include <sstream>
#include <boost/ptr_container/ptr_vector.hpp>
#include <cereal/archives/binary.hpp>
#include <cereal/types/string.hpp>

// Sample serializable object.
struct MyRecord {
   std::string s_;

   MyRecord(const std::string s = std::string())
      : s_(s) {
   }

   template <class Archive>
   void serialize(Archive& ar ) {
      ar(s_);
   }
};

// External save function for boost::ptr_vector<T>.
template<class Archive, class T>
void save(Archive& ar, const boost::ptr_vector<T>& pv) {
   ar(pv.size());
   for (const auto& element : pv)
      ar(element);
}

// External load function for boost::ptr_vector<T>.
template<class Archive, class T>
void load(Archive& ar, boost::ptr_vector<T>& pv) {
   size_t n;
   ar(n);

   pv.reserve(n);
   for (size_t i = 0; i < n; ++i) {
      pv.push_back(new T);
      ar(pv.back());
   }
}

int main() {
   // Serialize a boost::ptr_vector to a buffer.
   std::ostringstream os;
   {
      boost::ptr_vector<MyRecord> saved;
      saved.push_back(new MyRecord("how"));
      saved.push_back(new MyRecord("now"));
      saved.push_back(new MyRecord("brown"));
      saved.push_back(new MyRecord("cow"));

      cereal::BinaryOutputArchive oa(os);
      oa(saved);
   }

   // Serialize from the buffer.
   boost::ptr_vector<MyRecord> loaded;
   {
      std::istringstream is(os.str());
      cereal::BinaryInputArchive ia(is);
      ia(loaded);
   }

   for (const auto& element : loaded)
      std::cout << element.s_ << '\n';

   return 0;
}

这应该适用于任何默认可构造且已经可单独序列化的包含类型。

【讨论】:

  • .... 并且 saveload 的重载可以在 关联命名空间 中找到(参见 ADL)。我可能会补充一点,这个版本在加载时具有相当有趣的构造语义。没关系,因为 ptr_vectors 无论如何都不能有别名元素
  • @sehe,通过有趣的加载语义,您的意思是这可以更有效地完成?
  • 其实,不,看起来还不错。
猜你喜欢
  • 2015-01-15
  • 2018-04-30
  • 2020-06-20
  • 2017-06-07
  • 2018-03-12
  • 1970-01-01
  • 2017-02-19
  • 2017-09-03
  • 1970-01-01
相关资源
最近更新 更多