从 class 名称反序列化 python 中的 Protobuf
Deserialize Protobuf in python from class name
如何反序列化协议缓冲区消息,只知道协议生成的字符串名称class?
出于某种原因,我通过 DESCRIPTOR.full_name
获得的消息的完全限定名称与 python class 的实际位置不匹配,因此我无法反序列化它具有以下功能:
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
no module (name).
感谢任何帮助。
P.S.: 如果有帮助,我要解决的更大问题是将 protobuf 消息序列化到数据库,然后将其反序列化(我在此使用 postgresql 和 sqlalchemy案子)。由于常规 python pickle 不起作用 - 我希望存储一个元组 (message_cls_name, message_binary)
,其中 message_cls_name
是 protobuf 消息的完全限定名称,而 message_binary
是结果在消息中调用 SerializeToString
。我不清楚的部分是如何获取消息并将其反序列化为适当的 protobuf class.
这是一个示例解决方案..
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
,您必须以相同的方式命名它们,或者创建一个将完整描述符名称映射到模块的函数。否则你会卡住,不知道从哪里导入模块。
希望对您有所帮助.. ;)
祝你好运..
如何反序列化协议缓冲区消息,只知道协议生成的字符串名称class?
出于某种原因,我通过 DESCRIPTOR.full_name
获得的消息的完全限定名称与 python class 的实际位置不匹配,因此我无法反序列化它具有以下功能:
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
no module (name).
感谢任何帮助。
P.S.: 如果有帮助,我要解决的更大问题是将 protobuf 消息序列化到数据库,然后将其反序列化(我在此使用 postgresql 和 sqlalchemy案子)。由于常规 python pickle 不起作用 - 我希望存储一个元组 (message_cls_name, message_binary)
,其中 message_cls_name
是 protobuf 消息的完全限定名称,而 message_binary
是结果在消息中调用 SerializeToString
。我不清楚的部分是如何获取消息并将其反序列化为适当的 protobuf class.
这是一个示例解决方案..
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
,您必须以相同的方式命名它们,或者创建一个将完整描述符名称映射到模块的函数。否则你会卡住,不知道从哪里导入模块。
希望对您有所帮助.. ;)
祝你好运..