2

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

要求:

  1. 不同架构的可移植性(字节序和位数不应该成为问题)
  2. 数据必须是二进制格式。(没有文字)

当前代码:

// 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服务器异常退出。

4

1 回答 1

0

您需要使用 Boost 吗?看起来这里有一个类似的 SO 问题-有一个引用 Boost Serialization TODO 部分的响应(这里是最新的) - 看起来便携式二进制存档仍在作者的 TODO 列表中,所以我不确定是否有 Boost满足您要求的解决方案(尚未)。

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

替代方案:

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

希望这能给你一些新的想法。

于 2013-05-17T22:49:24.197 回答