那就是函数 createPb 中 msg name 我传错了吗
好像实现还是有点问题 ,这样返回的 message 对象好像不对,导致用 json 转 pb 的时候转出的结果是空的
这个调试可以了,非常感谢指导
我参照你最新的调试了一下,这个 msgName 应该传承的是 proto 文件中 message 对象的名字吧
另外一个就是 self.pbMoudle 这个列表传值是传生成的 pb 模块名字吗
非常感谢解答,但是还是有几点疑惑哈第一个是 self.descriptor.FindFileByName(file_name)¶ 这个方法传参应该是一个文件名字吧,返回的是一个 FileDescriptor 对象。但是 GetMessages() 传参对象是一个 file_protos – Iterable of FileDescriptorProto 是不能直接传递的吧
能麻烦老哥具体指导一下 python 如何基于反射去解析 protobuf,目前在做协议测试卡主了
那如何基于 编译后的 pb2.py 文件,进行 json 和 pb 序列化数据的准换呢
目前了解到的是都是需要 import ***pb2.py 然后再根据 protobuf 文件结构去序列化和反序列化。 但是这种方式因为在第一行要导入模块所以感觉不太通用。是想做一个通用的方法去解析多个 protobuf 文件然后在官网上了解到 reflection 模块中 ParseMessage 方法
.protobuf.reflection.ParseMessage(descriptor, byte_str)
但这个方法第一个参数对象的初始化里面很多参数都不太清楚
class google.protobuf.descriptor.Descriptor(name, full_name, filename, containing_type, fields, nested_types, enum_types, extensions, options=None, serialized_options=None, is_extendable=True, extension_ranges=None, oneofs=None, file=None, serialized_start=None, serialized_end=None, syntax=None, create_key=None)
确实看的有点吃力啊 在文档中有看到 reflect 模块中提供了这个方法
def ParseMessage(descriptor, byte_str):
"""Generate a new Message instance from this Descriptor and a byte string.
DEPRECATED: ParseMessage is deprecated because it is using MakeClass().
Please use MessageFactory.GetPrototype() instead.
Args:
descriptor: Protobuf Descriptor object
byte_str: Serialized protocol buffer byte string
Returns:
Newly created protobuf Message object.
"""
result_class = MakeClass(descriptor)
new_msg = result_class()
new_msg.ParseFromString(byte_str)
return new_msg
但是第一个参数 descriptor 的对象初始化参数传值不太明白又没有示例
class google.protobuf.descriptor.Descriptor(name, full_name, filename, containing_type, fields, nested_types, enum_types, extensions, options=None, serialized_options=None, is_extendable=True, extension_ranges=None, oneofs=None, file=None, serialized_start=None, serialized_end=None, syntax=None, create_key=None)
希望是原生的 protobuf 文件