基于Boost Serialization的进程间通信序列化与反序列化问题
解决方案
问题1:获取序列化后的字节大小
可以通过Boost IO流的tellp()方法获取已写入缓冲区的字节数,同时需要调用flush()确保归档器的所有数据都输出到数组缓冲区中,避免数据残留。修改后的save()函数如下:
uint32_t save(char* buffer, uint32_t buffer_max_size) { boost::iostreams::basic_array_sink<char> sink(buffer, buffer_max_size); boost::iostreams::stream<boost::iostreams::basic_array_sink<char>> os(sink); boost::archive::binary_oarchive oa(os); oa & *(this); os.flush(); // 确保所有序列化数据写入缓冲区 return static_cast<uint32_t>(os.tellp()); // 返回实际写入的字节数 }
注意:原示例代码中queue.send(buffer, sizeof(size), 0)存在错误,sizeof(size)是uint32_t的固定字节数(通常4字节),正确写法应该传入save()返回的实际序列化长度:
queue.send(buffer, size, 0);
问题2:实现反序列化的load()函数
使用boost::iostreams::basic_array_source包装输入数据,创建输入流后通过binary_iarchive完成反序列化。需要传入数据指针和数据长度以确保流能正确读取全部内容,实现如下:
void load(const void* data, uint32_t data_size) { boost::iostreams::basic_array_source<char> source(static_cast<const char*>(data), data_size); boost::iostreams::stream<boost::iostreams::basic_array_source<char>> is(source); boost::archive::binary_iarchive ia(is); ia & *(this); }
补充说明
- 序列化/反序列化时要确保缓冲区大小足够,避免溢出;
- 若
header类后续扩展成员,serialize()函数需同步更新以包含新成员; - 跨进程使用时,要保证两端的Boost版本、编译选项(如字节序、对齐方式)一致,避免序列化数据不兼容。
内容的提问来源于stack exchange,提问作者Kyung Lee
相关产品推荐
相关产品推荐

