我正在尝试使用 Boost.Serialization 和 Boost.Asio 库通过UDP序列化和恢复对象。以下几点总结了到目前为止我所知道的:
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
的其他一些示例如果我没记错的话,输入和输出缓冲区都是如此。
(文件流超出了我们的考虑范围,因为我需要从套接字而不是从文件进行写入/读取。)
答案 0 :(得分:4)
花时间阅读您在cppreference.com Input/output library上提到的流的描述,这很有启发性。
如果要序列化到内存,则只有一个流对您有用:ostringstream
。然后您从中提取字符串,然后随便发送。对于反序列化,请使用istringstream
。另外,两种情况下,stringstream
。
答案 1 :(得分:2)
要添加到Maxim的答案中,如果您确实要使用UDP,则需要注意将流拆分为数据报,并确保数据流的一致性。 UDP是面向数据报的,并且不能保证数据的一致性。
使用UDP时需要考虑的因素:
如果其中任何一个问题,您需要在协议中实施适当的对策,例如数据包序列号和请求数据包重传的方法。
大数据报可能会碎片化并严重降低性能。有人建议最大数据报大小为512字节。
因此,鉴于这些限制,我建议使用 compact 二进制序列化格式。例如,protobuf或msgpack。 Boost虽然不够好,但并不是很紧凑(来源:cpp-serializers)。