从类nam反序列化python中的Protobuf

2021-01-17 14:18:23 发布

您现在位置:Python中文网/ 问答频道 /正文

如何反序列化协议缓冲区消息,只知道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没有模块(名称)。

感谢任何帮助。

备注:如果有帮助的话,我要解决的更大的问题是将protobuf消息序列化到数据库,然后反序列化它(在本例中,我将postgresql与sqlalchemy一起使用)。因为常规的python pickle不起作用-我希望存储一个元组(message_cls_name, message_binary),其中message_cls_name是protobuf消息的完全限定名,而message_binary是对消息调用SerializeToString的结果。我不清楚的是如何将消息取出并反序列化为适当的protobuf类。