作者:海纳百川2602902033 | 来源:互联网 | 2023-05-19 13:25
如何只知道protoc生成的类的字符串名称,如何反序列化协议缓冲区消息?
由于某种原因,我得到的消息的完全限定名称与DESCRIPTOR.full_name
python类的实际位置不匹配,因此我无法使用以下函数反序列化它:
def get_class( kls ):
"""Get class given a fully qualified name of a class"""
parts = kls.split('.')
module = ".".join(parts[:-1])
m = __import__( module )
for comp in parts[1:]:
m = getattr(m, comp)
return m
我只是ImportError
没有模块(名称).
任何帮助赞赏.
PS:如果它有帮助,我试图解决的更大问题是将protobuf消息序列化到数据库,然后将其反序列化(在这种情况下我使用postgresql和sqlalchemy).由于常规的python pickle不起作用 - 我希望存储一个元组(message_cls_name, message_binary)
,其中message_cls_name
是protobuf消息的完全限定名称,并且message_binary
是调用SerializeToString
消息的结果.我不清楚的部分是如何将消息输出并将其反序列化为适当的protobuf类.
1> brunsgaard..:
这是一个示例解决方案..
from ocmg_common.protobuf.rpc_pb2 import Exception as PBException
from importlib import import_module
pb_message = PBException(message='hello world')
pb_message_string = pb_message.SerializeToString()
def deserialize(message, typ):
module_, class_ = typ.rsplit('.', 1)
class_ = getattr(import_module(module_), class_)
rv = class_()
rv.ParseFromString(message)
return rv
print(deserialize(pb_message_string, 'ocmg_common.protobuf.rpc_pb2.Exception'))
将输出
(env)? httppost git:(master) ? python test.py
message: "hello world"
如果您不知道该模块,但只需要DESCRIPTOR.full_name
以相同的方式命名它们,或者创建一个将完整描述符名称映射到模块的函数.否则你会被困住,不知道从哪里导入模块.
我希望它会帮助你..;)
祝你好运..