You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 05:05:03