【问题标题】:c++ network serialization [closed]c ++网络序列化[关闭]
【发布时间】:2011-08-03 04:29:02
【问题描述】:

我正在寻找将 c++ 数据包序列化为网络流的解决方案。

我在这里看到很多帖子提到人们:

  1. 王牌

  2. Google 协议缓冲区

  3. Boost::序列化

  4. Qt ::QDataStream

我的要求/限制:

  1. 解决方案必须不知道 LitteEndian/BigEndian。机器架构 x86/x64 和平台无关。

  2. 前 3 个解决方案的占用空间(RAM 和 ROM)对于我的平台来说太大了,第四个与下一个要求相冲突。

  3. 该解决方案不需要大量样板代码(将有 200 多个数据包需要序列化)。

谢谢, 科比·梅尔

【问题讨论】:

  • 嗯,没有 RYO,这不会发生。 大多数 OS 消息传递解决方案(例如 ZeroMq - AFAIK)将使用 ACE 或 boost::asio 等库之一。所以如果你想避免,又不想付钱,那么 RYO 包括低级套接字处理......祝你好运。

标签: c++ serialization protocol-buffers boost-serialization ace


【解决方案1】:

如果您发现 Google Protocol Buffers 太重(我同意这一点,因为编译的库可能需要超过 1 MB),您可以尝试使用小几倍的 protobuf 的 lite version。 可以通过插入以下行在 *.proto 文件中启用它

option optimize_for = LITE_RUNTIME;

但是,如果您需要一个开销最小的 protobuf 解决方案,我会选择 protobuf-c
protobuf 的 C 实现。 使用起来会有点困难,但二进制代码大小开销应该是最小的(30-50 KB)。我知道这个 C 实现被 umurmur 使用——一个在嵌入式 Linux ARM 和 MIPS 路由器上运行良好的语音服务器。

【讨论】:

  • 替代的小型 protobuf 库是 nanopb...
【解决方案2】:

另一个想法:序列化为文本,在另一边解析。

我们经常这样做(TCP、UDP、串行、其他协议)。这种方法具有极大的优先级,例如在机器人控制系统、实验室信息管理系统以及许多供应商之间“挂钩”有用的任何其他地方:每个人都只发送纯文本(ASCII 或 UTF-8),它是易于阅读,易于调试,易于逆向工程,易于修复/连接。 (如果您希望它不透明,您可以加密您的有效负载,例如使用公钥/私钥。)

这符合您对端不可知论/不同平台要求的要求。我们使用了 XML,它运行良好并且相当“标准”,带有一些参考本体,用于您想要的(可能是嵌套的)“Key=Value”值,但我们倾向于使用 INI 样式的格式,使用“命名部分” “因为它变得更加复杂。如果您“嵌套”了很多东西,您可能会查看类似 JSON 的实现(这真的很容易)。

强烈支持 ASCII,恕我直言。

【讨论】:

    【解决方案3】:

    哇,ACE,boost 序列化……这些框架都内置了序列化,但单看它们进行序列化就像买车,因为你需要 CD 播放器。 SUN/DEC RPC 使用一种称为 XDR 的格式——在 Steven 的“UNIX 网络编程”中有很好的描述——本质上它是一个 1000 LOC 的 header/c 文件。你可以单独使用。 CORBA 在下面也使用 XDR。只需在 Google 代码中查找“xdr.h”——大量的 OSS 实现。 如果您仍然需要复杂的东西,我会发现 ASN.1 是最全面的解决方案,它比大多数应用程序所需的复杂一点,但是 ASN.1 编译器生成紧凑的代码。它主要用于电信堆栈、cll 电话、GSM 消息等。ASN.1 用于编码 RSA 密钥。

    【讨论】:

    • +1 表示隐喻。 ASN.1 是一个相关选项,应该提到它,尽管我倾向于认为它仍然为 CD 播放器增加了很多东西——至少是一大堆文档和安装手册。
    【解决方案4】:

    我认为您必须推出自己的最终解决方案,但您可以使用一些构建块:

    • Boost::Spirit(Karma 用于序列化,Qi 用于反序列化)
      这对您来说可能仍然太大,在这种情况下,您必须自己进行序列化/反序列化,尽管您可以使用 Barton-Nackman idiom 来保持代码可读性并仍然使用简单的 serialize 函数
    • 轻量级通信层,例如 Arachnida(您可以仅用于通信,而不使用其 HTTP 工具)。
      Arachnida 建立在 OpenSSL 之上。如果这对你来说也太重了,你真的应该自己动手。

    对小/大字节序的无知/知识几乎掌握在您的序列化代码手中。..

    祝你好运

    【讨论】:

      【解决方案5】:

      我使用微软在MFC 中使用的相同技术实现了类似的功能。基本上你在每个可序列化的类中实现方法来序列化和反序列化 您想从该课程中保存的任何内容。它非常轻巧且快速。

      我没有使用 Microsoft 使用的“归档”类,而是使用了二进制流类。 我的要求不需要字节序意识,但它会是 如果您实现一个基类来序列化 POD 变量,那么实现起来很简单。

      【讨论】:

        猜你喜欢
        • 2018-08-16
        • 2011-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多