如何通过网络序列化和发送std :: list?

时间:2011-11-15 18:59:42

标签: c++ stl

我需要通过网络连接发送存储在std :: list中的动态大小的数据列表。我想在使用序列化的一次传递中执行此操作,而不是单独发送每个元素。有什么建议吗?

2 个答案:

答案 0 :(得分:5)

boost::serialization使这很容易做到。它免费提供std::list所需的所有机制,您需要做的就是添加对列表所包含类型的支持。 (如果它是“标准”类型,这也将存在)

完整示例(改编自this example):

#include <list>
#include <sstream>

#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
// Provide an implementation of serialize for std::list
#include <boost/serialization/list.hpp>

class foo
{
private:
  friend class boost::serialization::access;
  template<class Archive>
  void serialize(Archive & ar, const unsigned int /*version*/)
  {
    // This is the only thing you have to implement to serialize a std::list<foo>
    ar & value;
    // if we had more members here just & each of them with ar
  }
public:
  int value;
};

int main() {
  std::stringstream out;

  // setup a list
  std::list<foo> list;
  {
    const foo f = {-1};
    list.push_back(f);
  }

  // serialize into the stream
  {
    boost::archive::binary_oarchive oa(out);
    oa << list;
  }

  // read the stream into a newlist
  std::list<foo> newlist;
  {
    boost::archive::binary_iarchive ia(out);
    ia >> newlist;
  }

  std::cout << newlist.front().value << std::endl;
}

这通过std::stringstream“发送”和“接收”,但通过您选择的网络API调整发送和接收应该相当简单。

答案 1 :(得分:0)

使用xerces-C++转换为XML或从中发送/接收它。