给定protobuf序列化,是否可以获得消息中所有标记号的列表?一般来说,可以在没有定义.proto文件的情况下查看消息的结构吗?
大多数API确实具有某种形式的基于reader的API,允许您枚举原始protobuf流。然而,这本身不足以完全理解数据,因为如果没有模式,解释是模糊的:
- 变量可以是Z字形编码的(
sint32
/sint64
),也可以不是(int32
/int64
/uint32
/uint64
)-从根本上改变了含义,或者是布尔值,或者是枚举 - fixed-32/fixed-64可以是有符号或无符号整数,也可以是IEEE754浮点/双精度
- 前缀为长度的区块可以是UTF-8字符串、BLOB、子消息或"打包"的重复基元集;如果是子消息,则必须递归地重复
所以。。。是和否。当然,你可以得到最外层消息的字段号。
另一种方法是对没有成员(message Naked {}
)的类型使用常规API,然后通过许多实现提供的"扩展"API查询意外数据(即所有数据)。
您可以获得出现在一条特定消息中的所有标记号,但不会获得任何嵌套消息,也不会知道这些字段的类型,只知道可能类型的一些子集。
如果你观察有线编码,你可以看到(例如)字节数组、字符串和嵌套消息都是以相同的方式编码的——所以你可能知道"字段3是一个带长度前缀的二进制字段",但你不知道这意味着它是嵌套消息、字符串还是字节数组。