【问题标题】:Preferred way to serialize an object with Boost/C++ in binary format使用 Boost/C++ 以二进制格式序列化对象的首选方法
【发布时间】:2023-03-18 12:46:01
【问题描述】:

我想序列化一个类的实例并使用 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 异常退出。

【问题讨论】:

    标签: c++ serialization boost boost-asio


    【解决方案1】:

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

    您可以考虑使用 Boost 文本序列化存档,即使您的类不是基于文本的。这样做的缺点是速度较慢,序列化格式也比较臃肿,但是会便携。

    替代方案:

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

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

    【讨论】:

    • 我正在尝试编写可移植的代码(尽可能)。这就是使用 boost 的原因。目前我可以忽略架构上的二进制可移植性。虽然上面甚至没有在同一台机器上运行......我仍然需要关于 Binary Serialization with Boost ASIO/Serialization 的帮助。
    • 所以我接受这个答案并问另一个SO question。谢谢
    • 我会否决这个答案,因为我对 OP 的要求很感兴趣,而你走的是一条完全不同的道路。 “回答被问到的问题”怎么样??
    猜你喜欢
    • 1970-01-01
    • 2021-08-20
    • 2011-01-19
    • 2010-12-17
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2015-09-05
    相关资源
    最近更新 更多