java - 在没有源文件的情况下反序列化 protobuf

标签 java ruby protocol-buffers

是否可以在不访问源 .proto 文件/生成的类的情况下反序列化 protobuf 消息?我的源系统使用 Ruby 生成消息并使用 Java 进行消费。源系统可以创建消费者无法轻松了解的新消息格式。或者,消费者访问原型(prototype)类的最佳方式是什么?是否可能有某种原型(prototype)存储库?

最佳答案

如果没有架构(.proto 文件或编译的 Descriptor),您只能将 Protobuf 解码为一系列标记/值对,其中标记是数字和这些值的类型信息有限。这可能足以让人们对协议(protocol)进行逆向工程,但通常对代码没有用处。

可以通过发送 FileDescriptorSet(基本上是相关 .proto 文件的编译版本)来发送架构和有效负载,如此处所述:

https://developers.google.com/protocol-buffers/docs/techniques#self-description

但是,这并不像听起来那么有用! FileDescriptorSet 将允许您确定字段的名称和类型,但这并不意味着您的代码知道如何处理它们。

也就是说,有一些可能的用例:

  • 您可以拥有一个代理,根据架构将消息转换为 JSON。
  • 您可以拥有一个存储系统来解析消息,以便以不同的形式存储它。例如,它可能会转置行和列以实现更好的压缩,或者可能会对字段进行某种索引。

但是,在这些用例中,我通常建议使用必要的架构预先配置代理或存储系统,而不是随每条消息发送它们,因为架构往往非常大。

关于java - 在没有源文件的情况下反序列化 protobuf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35235028/

相关文章:

java - 使用 Jackson 将 protobuf 转换为 JSON?

java - 谷歌云构建器 - Java 版本

java - src/main/resources 下的哪些文件和 WEB-INF 下的文件?

java - Apache Tika 和文档元数据

java - 出现 NullPointerException - 如何删除它?

ruby-on-rails - rails - 当用户手动输入错误的 url 时重定向

ruby - 只加载 Ruby 中正在使用的类?

ruby-on-rails - 在分离的 Rails 应用程序中使用 Sequel 访问 postgres 数据库

protocol-buffers - protobuf 消息中的最大字段数

c# - 如何使用 Protobuf-net 处理复杂对象?