首页 > 解决方案 > 使用不支持的平台解码 Protobuf 编码数据

问题描述

我是 Protobufs 的新手;我对他们的接触不多。我们需要数据的 API 端点之一使用 Protobuf 编码数据。如果我使用诸如 JavaScript、Java、Python 甚至 R 之类的“受支持”语言来解码数据,这通常不会成为问题……

不幸的是,我正在尝试使用 Alteryx 自动化该过程。这不是一个 Alteryx 特定的问题,我有一些关于 Protobufs 本身的问题,所以我更好地理解了这种情况。我已经阅读了 Java 和 Python 中 Protobufs 的实现,并且对如何使用它们有了基本的了解。

推测(如果我错了,请纠正我),Protobuf 是一种序列化结构化数据的方法,其中 .proto 模式用于将数据编码/解码为原始二进制文件。我的困惑在于编译器。Python / Java 的 Google 文档和示例显示了如何需要 Protobuf 编译器(库)才能运行编码和解码过程。阅读谷歌网站,它建议 Protobufs 是“语言中立和平台中立的”,但如果您需要编译器(和 .proto 文件!)进行解码,我看不出这怎么可能。例如,使用谷歌编译器创建的语言之外的语言的人如何解码 Protobuf 编码数据?我错过了什么吗?

我想我遗漏了一些东西,因为公共 API 会强制执行此约束似乎很奇怪。

标签: protocol-buffers

解决方案


这里的“语言/平台中立”仅仅意味着您可以可靠地从任何语言/框架/平台获取相同的数据。序列化格式是独立定义的,不依赖于任何特定框架的细微差别。

这可能看起来很低,但您会惊讶于有多少序列化格式无法清除它。

因为指定了格式,所以任何人都可以为其他平台创建工具。如果您不习惯处理比特,这有点繁琐,但是:完全可行。protobuf 环境不依赖于 Google - 以下是一些已知的非 Google 工具的列表:https ://github.com/protocolbuffers/protobuf/blob/master/docs/third_party.md

另外,请注意,从技术上讲,您甚至不需要 .proto;您只需要一些机制来指定哪些字段映射到哪些字段编号(因为 protobuf 不包含名称)。该列表中的相当一部分可以从 .proto 或以其他方式指定的字段/数字映射工作。.proto 的优点很简单,它很容易作为模式来传达 - 而且:不依赖于任何特定的语言。您可以为“protoc”编写插件来添加自己的工具,因此您无需从头开始编写自己的解析器。或者,如果您愿意,也可以从头开始编写自己的解析器。


推荐阅读