gpt4 book ai didi

python - 从类名反序列化python中的Protobuf

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:13 26 4
gpt4 key购买 nike

如何在只知道协议(protocol)生成类的字符串名称的情况下反序列化 Protocol Buffer 消息?

出于某种原因,我通过 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 no module (name).

感谢任何帮助。

P.S.:如果它有帮助,我试图解决的更大问题是将 protobuf 消息序列化到数据库,然后将其反序列化(在这种情况下我使用 postgresql 和 sqlalchemy)。由于常规 python pickle 不起作用 - 我希望存储一个元组 (message_cls_name, message_binary) 其中 message_cls_name 是 protobuf 消息的完全限定名称,并且 message_binary 是对消息调用 SerializeToString 的结果。我不清楚的部分是如何获取消息并将其反序列化为适当的 protobuf 类。

最佳答案

这是一个示例解决方案..

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,则必须以相同的方式命名它们,或者创建一个将完整描述符名称映射到模块的函数。否则你会被卡住,不知道从哪里导入模块。

希望对您有所帮助..;)
祝你好运..

关于python - 从类名反序列化python中的Protobuf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28867596/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com