关于编组的好例子、文章和书籍

Good examples, articles and books on marshalling

本文关键字:文章 于编组      更新时间:2023-10-16

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

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

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

你推荐什么?

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

您可以将ASN.1看作一个通用的序列化解决方案。有免费的书籍和免费的实现:asn1c、a2c、snacc。

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

谷歌的Protobuf

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

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

还有关于如何使用protobufs实现RPC的大量文档。

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

在您的问题中,没有太多关于您所针对的平台/语言的上下文。。。。然而

最流行的是DCOM和CORBA。有嵌入式CORBA。。。。。你可以使用类似(ACE TAO库)中的TAO

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

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

  1. 考虑对数据进行编码。4字节用于int传输还是作为ascii传输
  2. 考虑是需要传输整个数据,还是只需要在两个树数据结构之间同步
  3. 每一位数据都需要知道它在树结构中的位置。识别数据位在这个问题上会有很大帮助
  4. 考虑一下需要转移什么?
    • 只是树节点中的数据
    • 树结构的变化
    • 整棵树
    • 数据的位置/id
  5. 识别数据
    • 使用从根到树节点的路径
    • 使用子树
    • 使用简单的数据节点
    • 识别树节点内的元素
  6. 考虑如何在树中发布数据
    • 也许可以编写出所有数据的接口
    • 你能用一个算法递归地遍历所有数据吗
    • 数据中是否存在无法轻易传输的指针

显然,一些像谷歌protobuf这样的库可以帮助。。。

您可以考虑使用Thrift。