Python Protocol Buffers v3.5.1消息中存在未知字段

时间:2018-02-06 09:38:12

标签: python protocol-buffers google-protocol-buffer

该协议缓冲了Python消息实现preserves unknown fields in messages as of v3.5.0。我注意到我可以使用message._unknown_fields确定特定消息中是否存在未知字段。

我有两个问题:

  1. m._unknown_fieldsm中为我提供了未知字段的值,但在m的任何子项中都没有。例如,如果m.a包含未知字段,则它们将显示在m.a._unknown_fields中,但不会显示在m._unknown_fields中。有没有办法确定消息或其任何子消息中是否有任何未知字段?我可以在每个节点上使用._unknown_fields查询在消息树中实现漫游,但这似乎有点过分;我想要的是确定在解析消息时是否遇到任何未知字段。

  2. _的{​​{1}}前缀似乎表明这是私有/未记录的呼叫。是否有批准的方法来确定是否存在未知字段?

1 个答案:

答案 0 :(得分:0)

  1. 要尽量减少破坏性,你几乎不得不走下去。那些未知的字段非常具体地与他们所附加的信息有关。

    您还应该能够通过调用最顶层消息上的DiscardUnknownFields()并比较消息之前和之后的ByteSize()来检测消息树的任何部分是否包含未知字段。如果价值下降,那么曾经有过未知的字段¯\ _(ツ)_ /¯

    这对于C ++编译的扩展库同样有效,据我所知,它不会在任何可见的地方提供_unknown_fields属性。如果您需要保留它们并且只需要知道它们是否存在,您可以使用CopyFrom(...)并尝试从副本中删除未知数。

  2. 我认为没有任何公共API可用于确定纯Python或编译版本库中是否存在未知字段。无论如何,如果有点奇怪的话,上面的内容仍然有效并且已经批准了。