没有 Boost 的序列化.序列化
Serialization without Boost.Serialization
我正在尝试为我的代码实现一个简单的序列化/反序列化方法,以便能够使用 MPI 通过网络传递对象。在理想的世界中,我会为此使用 Boost.Serialization
和Boost.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_Pack
和 MPI_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 所做的。
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- C++boost序列化多态性问题
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 如何在 boost::asio 中将打包的结构作为消息传递?(无序列化)
- 如何使用 Boost 序列化mersenne_twister_engine?
- boost::序列化中的派生类偏移量计算.有效吗?
- C++ Boost - 序列化错误 - 将"const B"作为"this"参数
- 序列化模式类似于boost::序列化
- 序列化和反序列化boost共享指针
- 使用 Boost::Serialization 序列化具有 std::mt19937_64 成员的类
- boost::container::vector 无法用谷物序列化?
- 使用 Boost 对具有 const 成员的类进行序列化
- 使用 boost::序列化代码将 *this 传递给模板函数会产生错误
- C++ 从 Boost object_pool构造的指针的 Boost 二进制序列化
- 如何使用谷物序列化 boost::p tr_vector
- 如何用谷物序列化 boost::uuid
- 派生类行程的序列化Boost断言
- 如何使用Boost序列化来序列化Boost scoped_array
- 如何序列化 <boost::shared_ptr<void *>> 类型的列表变量
- 我如何重载序列化boost函数,使其一个用于文件存储,另一个用于tcp消息