【问题标题】:Good examples, articles and books on marshalling [closed]关于编组的好例子、文章和书籍[关闭]
【发布时间】:2011-09-09 16:31:14
【问题描述】:

在为基于智能卡的加密狗开发软件保护库时,我意识到我需要在客户端应用程序和加密狗内的代码之间来回传输一些树状数据结构。

嗯,当使用 Web 服务时,XML-RPC 或 JSON-RPC 等技术是合理的考虑方式。然而,对于像智能卡这样的嵌入式设备,情况并非如此。您需要使用一些二进制格式来优化内存使用并获得良好的性能。

我想我需要的是实现一些二进制数据封送算法。我不喜欢重新发明整个轮子的想法,而且我很确定有很多关于编组此类问题的书籍、文章和示例。

你会推荐什么?

UPD。我在 Linux 上使用 C 和 C++,但问题是关于一般编组算法的信息。

【问题讨论】:

  • 我不敢相信这个问题被标记为已关闭。对于许多目的来说,这是一个很好的话题。同时,我看到一些问题询问与在迭代时编辑就地列表相关的问题......
  • protobuf 不支持自引用,我猜(希望我错了)

标签: c++ c serialization marshalling rpc


【解决方案1】:

您的问题中没有太多关于您所针对的平台/语言的上下文......但是!

最受欢迎的是(是?)DCOM 和 CORBA。有嵌入式 CORBA .....您可以使用(ACE TAO 库)中的 TAO 之类的东西

但如果这是相当小的规模,您可以自己序列化它,要记住的主要是对序列化格式进行版本化,以便您可以更改它并支持旧版本(如果这是您项目中的一个问题)

【讨论】:

    【解决方案2】:

    您可以将 ASN.1 视为通用序列化解决方案。 有free books 和免费实现:asn1ca2c、snacc。

    但是 ASN.1 是一个巨大的。更简单的 protobuf 或 xdr 足以胜任您的任务。

    【讨论】:

      【解决方案3】:

      Google's Protobuf

      首先我要区分封送处理和 RPC(使用封送处理)。 Google Protobuf 是通过网络进行编组的最佳解决方案。它占用空间极小,并以闪电般的速度进行编码/解码。

      如果您仍然对如何实现高效编组感兴趣,请查看protobuf encoding 的文档。
      编码页面中的一个示例是 varint。 Varint 是 protobuf 以二进制格式编码无符号整数的方式。 Varint 针对小数字进行了优化。例如,1 只使用网络上的一个字节,而 300 使用两个字节。
      当然,protobuf 设计者意识到我们经常使用整数作为位掩码等。因此他们还提供了一个始终为四个字节的整数数据类型(这样设置 msb 位的掩码不会占用额外的空间)。

      还有ample documentation关于如何使用protobufs实现RPC。

      【讨论】:

        【解决方案4】:

        序列化/编组和树状数据结构一起听起来是个大问题。以下是我将如何开始解决它的一些方面:

        1. 考虑数据的编码。 4 个字节用于 int 传输或 ascii 传输?
        2. 考虑是否需要传输整个数据或仅在两个树数据结构之间同步
        3. 每一位数据都需要知道它在树结构中的位置。识别数据位将有助于解决这个问题。
        4. 考虑需要转移什么?
          • 只是树节点内的数据?
          • 更改树结构?
          • 整棵树?
          • 数据的位置/ID?
        5. 识别数据
          • 使用从根到树节点的路径?
          • 使用子树?
          • 使用简单的数据节点
          • 标识树节点内的元素?
        6. 考虑如何在树中发布数据
          • 可能是写出所有数据的接口?
          • 你能用算法递归地遍历所有数据吗
          • 数据中是否存在不能轻易传输的指针?

        显然,像 google protobuf 这样的一些库可以提供帮助...

        【讨论】:

          【解决方案5】:

          您可能还想看看 Messagepack (http://msgpack.org)。它声称比 Protobuf 快 4 倍。与 Protobuf 不同的是,这个库支持继承。

          【讨论】:

          • 感谢您指出这个伟大的图书馆!
          【解决方案6】:

          您可以考虑使用Thrift

          【讨论】:

            猜你喜欢
            • 2011-05-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-03
            相关资源
            最近更新 更多