我对Pyro4完全陌生。我希望提供一个python类,其中包含一个属性,该属性是已编译为python类的protobuf对象的实例。
import sys
import os
import Pyro4
import MPB_pb2 as mpb # My Protobuf class
@Pyro4.expose
@Pyro4.behavior(instance_mode="single")
class MyWrappedProtobuf(object):
def __init__(self):
self.setup_MyProtobuf()
def setup_MyProtobuf(self):
self.__MyProtobuf = mpb.MyProtobufMessage()
@property
def MyProtobuf(self):
return self.__MyProtobuf
设置服务器运行后,我创建服务对象的代理,并查询MyProtobuf属性:
u = Pyro4.Proxy('PYRONAME:{}'.format(<server name>)).MyProtobuf
我得到的是一个序列化对象:
>>>u
{'serialized': '\n$\n\x05world\x12\x1b\t\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00'}
我从文档(https://pythonhosted.org/Pyro4/clientcode.html#changing-the-way-your-custom-classes-are-de-serialized)了解到,“默认情况下,自定义类被序列化为字典。它们不会反序列化为自定义类的实例。”
我正在寻找说明,或一个示例,说明如何将这个序列化的字典放回我的类,包括该类包含的protobuf消息实例。
这似乎是一个普通的,微不足道的操作,但是我找不到一个很好的例子来展示给我,文档也没有提供我可以看到的明确帮助。
谢谢!
答案 0 :(得分:1)
默认情况下,Pyro使用Serpent序列化器,后者又使用python的原始类型将内容序列化为。通常这将是一本字典。如果它是一个不容易识别的类,或者该类没有定义“合适的”序列化方法,则它将退回到特殊的字典形式,例如:
{
"__class__": "pakcage.Classname"
"property1": "value1",
...
}
您看不到序列化的形式。这意味着不是Pyro(或Serpent,而是蛇)为您序列化了它。发生的事情(我认为)是Protobuf对象定义了一个__getstate __()方法,该方法返回您所看到的protobuf对象的序列化形式。与此相反的是__setstate __(...)(这些方法是从Python的内置pickle序列化器机制中“借用”的)。我没有protobuf的经验,但我想这很简单:
u = proxy.MyProtoBuf
message = mpb.MyProtobufMessage() # create empty protobuf object (??)
message.__setstate__(u)
可以解决问题。我建议您仔细阅读protobuf的文档,以了解如何序列化它们的对象(您可能必须搜索它们的腌制方式)。底线;这不是火焰兵(或蛇)所能控制的。
答案 1 :(得分:0)
它确实是从我所见的protobuf序列化的。对孔夫子进行分类后,我发现序列化的结果是unicode。为了使我能够使用protobuf对结果进行反序列化,我需要将其编码为纯ascii(使用<result>.encode('utf-8')
)。我不确定为什么它会返回unicode,此后它不会转身接受。但是,我有一个可行的解决方案。