如何访问未知字段 - python protobuf
How to access unknown fields - python protobuf
我正在处理大量结构相似但不完全相同的消息类型。这些中的所有共同点都在另一条消息中。当收到消息时,我使用通用消息类型对其进行解析。但是,我似乎无法找到一种方法来访问这种类型之外的字段(即非公共字段)。有没有办法访问 python 中设置的未知字段?
编辑:
我刚刚在文档中看到了这个:
"如果消息有未知字段,当前的 Java 和 C++ 实现将它们以任意顺序写入按顺序排列的已知字段之后。当前的 Python 实现不会不跟踪未知字段。"
这是否意味着如果我使用普通类型进行解析,例如:
proto = msg_pb2.Common()
proto.ParseFromString(raw_msg)
是否丢弃了消息 Common 中未定义的任何字段?
对于寻找此问题答案的人,reflection
模块帮助了我:
https://developers.google.com/protocol-buffers/docs/reference/python/google.protobuf.reflection-module
相关示例代码:
示例用法:
file_descriptor = descriptor_pb2.FileDescriptorProto()
file_descriptor.ParseFromString(proto2_string)
msg_descriptor = descriptor.MakeDescriptor(file_descriptor.message_type[0])
msg_class = reflection.MakeClass(msg_descriptor)
msg = msg_class()
Args:
descriptor: A descriptor.Descriptor object describing the protobuf.
Returns:
The Message class object described by the descriptor.
我正在处理大量结构相似但不完全相同的消息类型。这些中的所有共同点都在另一条消息中。当收到消息时,我使用通用消息类型对其进行解析。但是,我似乎无法找到一种方法来访问这种类型之外的字段(即非公共字段)。有没有办法访问 python 中设置的未知字段?
编辑: 我刚刚在文档中看到了这个:
"如果消息有未知字段,当前的 Java 和 C++ 实现将它们以任意顺序写入按顺序排列的已知字段之后。当前的 Python 实现不会不跟踪未知字段。"
这是否意味着如果我使用普通类型进行解析,例如:
proto = msg_pb2.Common()
proto.ParseFromString(raw_msg)
是否丢弃了消息 Common 中未定义的任何字段?
对于寻找此问题答案的人,reflection
模块帮助了我:
https://developers.google.com/protocol-buffers/docs/reference/python/google.protobuf.reflection-module
相关示例代码:
示例用法:
file_descriptor = descriptor_pb2.FileDescriptorProto()
file_descriptor.ParseFromString(proto2_string)
msg_descriptor = descriptor.MakeDescriptor(file_descriptor.message_type[0])
msg_class = reflection.MakeClass(msg_descriptor)
msg = msg_class()
Args:
descriptor: A descriptor.Descriptor object describing the protobuf.
Returns:
The Message class object described by the descriptor.