没有 Boost 的序列化.序列化

Serialization without Boost.Serialization

本文关键字:序列化 Boost 没有      更新时间:2023-10-16

我正在尝试为我的代码实现一个简单的序列化/反序列化方法,以便能够使用 MPI 通过网络传递对象。在理想的世界中,我会为此使用 Boost.SerializationBoost.MPI,但它们没有安装在我可以访问的某些集群上,所以我正在考虑自己这样做。

我的策略是将每个对象序列化为std::stringstream对象,然后使用 MPI_CHAR 作为数据类型通过MPI_Send发送消息。在这种情况下,我会传递std::stringstream::str()::c_str()作为指针,std::streaingstream::str()::size()*sizeof(char)作为消息的大小。

我已经想出了如何将所有内容序列化为std::stringstream对象。我的反序列化方法还获取一个std::stringstream对象并反序列化所有内容。这工作正常,除了我不知道如何从 char 的数组创建一个 std::stringstream 对象并避免从数组到流中的额外副本。我是否应该更改反序列化方法以使用 memcpy 直接处理char数组?

MPI 执行此操作的方式是使用 MPI_PackMPI_Unpack 。当然,这是C,可能不如使用C++功能方便。有关简单示例,请参阅 http://www.mcs.anl.gov/research/projects/mpi/tutorial/mpiexmpl/src/bcast/C/pack/solution.html

使用从char数组中提取的istrstream。此标头为 <strstream> 。而且,是的,它在C++标准中正式被弃用。该委员会在早期沉迷于大量的一厢情愿的想法。 istrstream不会消失。

尽管接受的答案是正确的方法,但具体问题"除了我不知道如何从字符数组创建std::stringstream对象"尚未得到回答。

答案是,实际上你不能。

大概内存中已经有一个对象,您希望将其视为stringstream,即使您可以使其工作,stringstream也无法在现有内存中进一步增长(这是流缓冲区的有用属性。

此外,英

勇地尝试复制将在 MPI 消息中发送的数据也没有多大意义。无论如何,MPI 最终可能会在内部将数据复制到"固定"内存,例如,具体取决于确切的通信方法(缓冲、无缓冲、异步等)。这是我的理解。

如果数据太大而无法复制(例如许多千兆字节),那么最好使用MPI_Datatype s,这对于以通用方式处理可能是一个真正的挑战。

顺便说一句,公认的答案是我的 MPI 库在内部 https://gitlab.com/correaa/boost-mpi3 所做的,它可能也是原始 Boost.MPI 所做的。