是否可以从给定的protobuf序列化中提取所有标记号?

时间:2012-02-06 09:54:39

标签: java python google-api protocol-buffers

鉴于protobuf序列化,是否可以获取消息中所有标记号的列表?通常可以在没有定义.proto文件的情况下查看消息的结构吗?

2 个答案:

答案 0 :(得分:2)

大多数API确实会有某种形式的基于读者的API,允许您枚举原始的protobuf流。但是,这本身并不足以完全理解数据,因为没有模式解释是不明确的:

  • varint可以是zig-zag编码(sint32 / sint64),不是(int32 / int64 / uint32 / {{1} }) - 从根本上改变含义,或布尔值或枚举
  • fixed-32 / fixed-64可以是有符号或无符号整数,也可以是IEEE754 float / double
  • 长度前缀的块可以是UTF-8字符串,BLOB,子消息或“打包”重复的基元集;如果是子消息,则必须递归重复

所以......是的,没有。当然,您可以获取最外层消息的字段编号。

另一种方法是对无成员uint64)的类型使用常规 API,然后查询意外数据(即所有它)通过许多实现提供的“扩展”API。

答案 1 :(得分:2)

您可以获取显示在一个特定消息中的所有标记号,但您不会获得任何嵌套消息 - 并且您将不会知道这些字段的类型,只是某些子集的可能的类型。

如果查看wire encoding,可以看到(例如)字节数组,字符串和嵌套消息都以相同的方式编码 - 因此您可能知道“字段3是长度为前缀的二进制文件字段“但你不会知道这是否是嵌套消息,字符串或字节数组。