我正在尝试使用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
,如果我没有弄错的话,它充当输入和输出缓冲区。
(文件流不在等式中,因为我需要从套接字写入/读取而不是从文件中读取。)
花点时间阅读你在cppreference.com Input/output library上提到的溪流的描述,这是非常有启发性的。
如果要序列化到内存中,只有一个流适合您:ostringstream
。然后从中提取字符串并随意发送。对于反序列化,请使用istringstream
。或者,stringstream
两种情况。
要添加到Maxim的答案,如果您真的想使用UDP,则需要注意将流拆分为数据报并确保数据流的一致性。 UDP是面向数据报的,不保证数据一致性。
使用UDP时需要考虑的因素:
如果其中任何一个是问题,您需要在协议中实施适当的对策,例如:分组序列号和请求分组重传的方式。
大数据报可能会碎片化并严重降低性能。有些人建议最大数据报大小为512字节。
因此,考虑到这些限制,我建议使用紧凑的二进制序列化格式。例如,protobuf或msgpack。 Boost不是很紧凑,虽然可以很好(来源:cpp-serializers)。