簡體   English   中英

從類名反序列化python中的Protobuf

[英]Deserialize Protobuf in python from class name

如何只知道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類。

這是一個示例解決方案..

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 ,則必須以相同的方式命名它們,或者創建一個將完整描述符名稱映射到模塊的函數。 否則你會被困住,不知道從哪里導入模塊。

我希望它會幫助你..;)
祝你好運..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM