是否可以在不访问源 .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/