该协议缓冲了Python消息实现preserves unknown fields in messages as of v3.5.0。我注意到我可以使用message._unknown_fields
确定特定消息中是否存在未知字段。
我有两个问题:
m._unknown_fields
在m
中为我提供了未知字段的值,但在m
的任何子项中都没有。例如,如果m.a
包含未知字段,则它们将显示在m.a._unknown_fields
中,但不会显示在m._unknown_fields
中。有没有办法确定消息或其任何子消息中是否有任何未知字段?我可以在每个节点上使用._unknown_fields
查询在消息树中实现漫游,但这似乎有点过分;我想要的是确定在解析消息时是否遇到任何未知字段。
_
的{{1}}前缀似乎表明这是私有/未记录的呼叫。是否有批准的方法来确定是否存在未知字段?
答案 0 :(得分:0)
要尽量减少破坏性,你几乎不得不走下去。那些未知的字段非常具体地与他们所附加的信息有关。
您还应该能够通过调用最顶层消息上的DiscardUnknownFields()
并比较消息之前和之后的ByteSize()
来检测消息树的任何部分是否包含未知字段。如果价值下降,那么曾经有过未知的字段¯\ _(ツ)_ /¯
这对于C ++编译的扩展库同样有效,据我所知,它不会在任何可见的地方提供_unknown_fields
属性。如果您需要保留它们并且只需要知道它们是否存在,您可以使用CopyFrom(...)
并尝试从副本中删除未知数。
我认为没有任何公共API可用于确定纯Python或编译版本库中是否存在未知字段。无论如何,如果有点奇怪的话,上面的内容仍然有效并且已经批准了。