使用二进制格式的Boost / C ++序列化对象的首选方法

时间:2013-05-17 21:29:50

标签: c++ serialization boost boost-asio

我想序列化一个类的实例,并使用C ++ / Boost库通过TCP连接发送它们。有太多的工作示例......有些使用文本流作为缓冲区,有些使用tcp::iostream。我不确定哪一个适合我的需要。

要求:

  1. 不同架构的可移植性(endiannes和bitness应该不是问题)
  2. 数据需要采用二进制格式。 (没有文字)
  3. 当前代码:

    // Client side:
    boost::asio::streambuf b;
    std::ostream os(&b);
    boost::archive::binary_oarchive oa(os);
    message m; // The `message' class is serializable
    // construct `m'
    oa << m;
    boost::asio::write(socket,b.data(),boost::asio::transfer_all());
    
    // Server side:
    boost::asio::streambuf b;
    std::istream is(&b);
    boost::archive::binary_iarchive ia(is);
    boost::asio::read(socket,b,boost::asio::transfer_all());
    message m;
    ia >> m;
    

    哪个不行。服务器退出时出现invalid signature异常。

1 个答案:

答案 0 :(得分:1)

您需要使用Boost吗?看起来有一个类似的SO问题here - 有一个响应引用了Boost Serialization TODO部分(这里是latest) - 它看起来像一个可移植的二进制存档仍然在作者的TODO列表中,所以我不确定是否有满足您要求的Boost解决方案。

您可以考虑使用Boost文本序列化存档,即使您的类不是基于文本的。这样做的缺点是速度较慢,序列化格式更加臃肿,但它可以移植。

查看替代方案:

  • Google Protocol Buffers(GPB) - 此库旨在用于与平台无关且与语言无关的通信。您可以使用GPB规范语言定义项目,而不是创建“消息”类并定义序列化,GPB提供工具来解析该规范并生成代码以对该项进行编组/解组
  • SLICE - 与GPB类似,但使用更丰富的规范语言

希望这会给你一些新想法。