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

C++ 如何通过网络序列化和发送std::list?,c++,stl,C++,Stl,我需要通过网络连接发送存储在std::list中的动态大小的数据列表。我希望使用序列化一次性完成这项工作,而不是单独发送每个元素。有什么建议吗?用于与XML进行转换,并发送/接收XML。使此操作相当容易。它免费提供了std::list所需的所有机制,您只需为列表中的类型添加支持即可。(如果是“标准”类型,则该类型也将存在) 完整示例(改编自): #包括 #包括 #包括 #包括 //为std::list提供序列化的实现 #包括 福班 { 私人: 好友类boost::serialization::a

我需要通过网络连接发送存储在std::list中的动态大小的数据列表。我希望使用序列化一次性完成这项工作,而不是单独发送每个元素。有什么建议吗?

用于与XML进行转换,并发送/接收XML。

使此操作相当容易。它免费提供了
std::list
所需的所有机制,您只需为列表中的类型添加支持即可。(如果是“标准”类型,则该类型也将存在)

完整示例(改编自):

#包括
#包括
#包括
#包括
//为std::list提供序列化的实现
#包括
福班
{
私人:
好友类boost::serialization::access;
模板
void序列化(存档&ar,常量unsigned int/*版本*/)
{
//这是序列化std::list所必须实现的唯一功能
应收账款&价值;
//如果我们这里有更多的会员,每个人都有ar
}
公众:
int值;
};
int main(){
std::stringout;
//设置列表
std::列表;
{
const foo f={-1};
列表。推回(f);
}
//序列化到流中
{
boost::archive::二进制文件oarchive oa(out);
oa>newlist;
}

std::cout有boost::serialization,但它是否可行取决于您的需求,比如吞吐量是否重要?试试Apache Thrift。它有点可爱。您可能仍然需要一次遍历一个元素的列表(我想这取决于您的列表实现)。通过“批处理”,您仍然可以获得一点收益IO就像你建议的那样,但我不相信。遗憾的是,boost::serialization在发送小数据包时效果不佳,只有在发送非常大的有效负载时才能真正发挥作用,否则元数据将占用不合理的空间。如果存档大小很重要,即使使用I,boost::serialization总体上也是一个糟糕的选择r二进制变体。我喜欢
boost:serialization
,特别是它如何将存储和检索与单个操作结合起来。但我不清楚如何检查错误。@Ylisar
boost::serialization
是可扩展的。本质上,它只是概念,而实际的序列化是在这些概念之上的。库来了使用自定义文本和二进制实现,以及XML实现。但是,如果您认为可以做得更好,可以使用自己的自定义序列化前端扩展库。@awoodland是的,我绝对认为对于某些用例来说,这是一个很好的选择,碰巧我在d对我们的用例很不满意。我们是一个游戏工作室,所以对于多人游戏,我们绝对必须使用UDP。最佳的UDP数据包大小约为1500字节,所以保持较小的大小很重要。@Ylisar-我今天偶然发现-看起来在重要的情况下,您可以关闭所有开销!(看起来很方便,虽然我还没有试过)
#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;
}