[英]Deserialize protobuf buffer in Python from C++ with pybind11
[英]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.