哪个流适合通过UDP进行序列化?

时间:2018-06-20 11:52:20

标签: c++ network-programming boost-asio boost-serialization

我正在尝试使用 Boost.Serialization Boost.Asio 库通过UDP序列化和恢复对象。以下几点总结了到目前为止我所知道的:

  • Boost.Serialization 的主要概念是存档。档案是代表序列化C ++对象的字节序列。
  • boost::archive::text_oarchive 序列化文本流数据,类boost::archive::text_iarchive 从此类数据恢复 文本流
  • 档案馆的建设者希望使用输入或输出流作为参数。该流用于序列化或还原数据。

来源:https://theboostcpplibraries.com/boost.serialization-archive

我知道我必须将流作为参数传递给存档。然而,有几种不同类型的流是合适的候选者。请参见以下图:

stream types

来源:https://stackoverflow.com/a/8116698/3599179

我看过使用ostreamistream的在线序列化示例,使用ostringstreamistringstream的其他示例,以及使用streambuf的其他一些示例如果我没记错的话,输入和输出缓冲区都是如此。

(文件流超出了我们的考虑范围,因为我需要从套接字而不是从文件进行写入/读取。)

  • 上述每种流都有哪些优点/缺点?
  • 考虑到我必须通过UDP发送序列化的对象, 流是最佳人选?

2 个答案:

答案 0 :(得分:4)

花时间阅读您在cppreference.com Input/output library上提到的流的描述,这很有启发性。

如果要序列化到内存,则只有一个流对您有用:ostringstream。然后您从中提取字符串,然后随便发送。对于反序列化,请使用istringstream。另外,两种情况下,stringstream

答案 1 :(得分:2)

要添加到Maxim的答案中,如果您确实要使用UDP,则需要注意将流拆分为数据报,并确保数据流的一致性。 UDP是面向数据报的,并且不能保证数据的一致性。

使用UDP时需要考虑的因素:

  • 数据报在传输中可能会丢失。
  • 数据报可能会到达一次以上。
  • 数据报在传输过程中可能会损坏(有一个校验和,但它是可选的且较弱)。
  • 数据报可能会无序到达。
  • 网络或接收者的带宽可能不足以发送者发送的速率。

如果其中任何一个问题,您需要在协议中实施适当的对策,例如数据包序列号和请求数据包重传的方法。

大数据报可能会碎片化并严重降低性能。有人建议最大数据报大小为512字节。

因此,鉴于这些限制,我建议使用 compact 二进制序列化格式。例如,protobuf或msgpack。 Boost虽然不够好,但并不是很紧凑(来源:cpp-serializers)。