在没有源文件的情况下反序列化 protobufs
Deserializing protobufs without source file
是否可以在不访问源 .proto 的情况下反序列化 protobuf 消息 file/generated 类?我的源系统使用 Ruby 生成消息并在 Java 中使用。源系统可以创建消费者不容易了解的新消息格式。或者,消费者访问原型 类 的最佳方式是什么?是否可能有某种原型存储库?
没有模式(.proto
文件或编译的 Descriptor
),您只能将 Protobuf 解码为一系列 tag/value 对,其中标签是数字,值具有类型信息有限。这可能足以让人类对协议进行逆向工程,但通常对代码没有用。
可以通过发送 FileDescriptorSet
(基本上是相关 .proto
文件的编译版本)来发送架构和负载,如下所述:
https://developers.google.com/protocol-buffers/docs/techniques#self-description
然而,这并不像听起来那么有用! FileDescriptorSet
将允许您确定字段的名称和类型,但这并不意味着您的代码将知道如何处理它们。
也就是说,有一些可能的用例:
- 您可以有一个代理,根据架构将消息翻译成 JSON。
- 您可以有一个存储系统来解析消息以便以不同的形式存储它。例如,它可能会转置行和列以实现更好的压缩,或者它可能会对字段进行某种索引。
但是,在这些用例中,我通常建议代理或存储系统预先配置必要的架构,而不是将它们与每条消息一起发送,因为架构往往非常大。
是否可以在不访问源 .proto 的情况下反序列化 protobuf 消息 file/generated 类?我的源系统使用 Ruby 生成消息并在 Java 中使用。源系统可以创建消费者不容易了解的新消息格式。或者,消费者访问原型 类 的最佳方式是什么?是否可能有某种原型存储库?
没有模式(.proto
文件或编译的 Descriptor
),您只能将 Protobuf 解码为一系列 tag/value 对,其中标签是数字,值具有类型信息有限。这可能足以让人类对协议进行逆向工程,但通常对代码没有用。
可以通过发送 FileDescriptorSet
(基本上是相关 .proto
文件的编译版本)来发送架构和负载,如下所述:
https://developers.google.com/protocol-buffers/docs/techniques#self-description
然而,这并不像听起来那么有用! FileDescriptorSet
将允许您确定字段的名称和类型,但这并不意味着您的代码将知道如何处理它们。
也就是说,有一些可能的用例:
- 您可以有一个代理,根据架构将消息翻译成 JSON。
- 您可以有一个存储系统来解析消息以便以不同的形式存储它。例如,它可能会转置行和列以实现更好的压缩,或者它可能会对字段进行某种索引。
但是,在这些用例中,我通常建议代理或存储系统预先配置必要的架构,而不是将它们与每条消息一起发送,因为架构往往非常大。