哪个流适合通过UDP进行序列化?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哪个流适合通过UDP进行序列化?相关的知识,希望对你有一定的参考价值。
我正在尝试使用Boost.Serialization和Boost.Asio库在UDP上序列化和恢复对象。以下几点总结了我目前所知:
- Boost.Serialization的主要概念是归档。存档是表示序列化C ++对象的字节序列。
- 类
boost::archive::text_oarchive
将数据序列化为文本流,类boost::archive::text_iarchive
从这样的文本流中恢复数据。 - 归档的构造者期望输入或输出流作为参数。该流用于序列化或恢复数据。
来源:https://theboostcpplibraries.com/boost.serialization-archive
我知道我必须将一个流作为参数传递给存档。但是,有一些不同类型的流是合适的候选者。请参阅以下数据:
来源:https://stackoverflow.com/a/8116698/3599179
我已经看过使用ostream
和istream
的在线序列化示例,其他示例使用ostringstream
和istringstream
以及其他一些使用streambuf
,如果我没有弄错的话,它充当输入和输出缓冲区。
(文件流不在等式中,因为我需要从套接字写入/读取而不是从文件中读取。)
- 每个上述流有哪些优点/缺点?
- 考虑到我必须通过UDP发送序列化对象,哪个流是最佳候选者?
花点时间阅读你在cppreference.com Input/output library上提到的溪流的描述,这是非常有启发性的。
如果要序列化到内存中,只有一个流适合您:ostringstream
。然后从中提取字符串并随意发送。对于反序列化,请使用istringstream
。或者,stringstream
两种情况。
要添加到Maxim的答案,如果您真的想使用UDP,则需要注意将流拆分为数据报并确保数据流的一致性。 UDP是面向数据报的,不保证数据一致性。
使用UDP时需要考虑的因素:
- 数据报可能在传输过程中丢失。
- 数据报可能不止一次到达。
- 数据报在传输过程中可能会损坏(有校验和,但它是可选的和弱的)。
- 数据报可能无序到达。
- 网络或接收方的带宽可能不足以满足发送方发送的速率。
如果其中任何一个是问题,您需要在协议中实施适当的对策,例如:分组序列号和请求分组重传的方式。
大数据报可能会碎片化并严重降低性能。有些人建议最大数据报大小为512字节。
因此,考虑到这些限制,我建议使用紧凑的二进制序列化格式。例如,protobuf或msgpack。 Boost不是很紧凑,虽然可以很好(来源:cpp-serializers)。
以上是关于哪个流适合通过UDP进行序列化?的主要内容,如果未能解决你的问题,请参考以下文章