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

问题描述 投票:0回答:2

我正在尝试使用Boost.SerializationBoost.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发送序列化对象,哪个流是最佳候选者?
c++ network-programming boost-asio boost-serialization
2个回答
4
投票

花点时间阅读你在cppreference.com Input/output library上提到的溪流的描述,这是非常有启发性的。

如果要序列化到内存中,只有一个流适合您:ostringstream。然后从中提取字符串并随意发送。对于反序列化,请使用istringstream。或者,stringstream两种情况。


2
投票

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

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

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

如果其中任何一个是问题,您需要在协议中实施适当的对策,例如:分组序列号和请求分组重传的方式。

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

因此,考虑到这些限制,我建议使用紧凑的二进制序列化格式。例如,protobuf或msgpack。 Boost不是很紧凑,虽然可以很好(来源:cpp-serializers)。

© www.soinside.com 2019 - 2024. All rights reserved.