我对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)中了解到,“默认情况下,自定义类被序列化到dict中,它们不会反序列化回自定义类的实例中。”
我正在寻找说明,或者一个示例,描述如何将这个序列化字典转换回我的类,包括该类包含的protobuf消息实例。你知道吗
似乎这一定是一个常见的、琐碎的操作,但是我找不到一个好的示例来演示,而且文档并没有提供我能看到的明确的帮助。你知道吗
谢谢你!你知道吗
它确实是从我看到的protobuf中序列化的。对confucion进行排序后,我发现序列化的结果是unicode。为了使protobuf能够反序列化结果,我需要将其编码为纯ascii(使用
<result>.encode('utf-8')
)。我不知道为什么它会返回unicode,它以后不会返回并接受它。不过,我有一个可行的解决方案。你知道吗默认情况下,Pyro使用Serpent序列化程序,而Serpent序列化程序又使用python的基元类型将内容序列化为。通常这是一本字典。如果它是一个不容易识别的类,或者该类没有定义“合适的”序列化方法,它将返回到一个特殊的字典形式,例如:
你看不到这个在你的序列化形式。这意味着它不是Pyro(或者说蛇)为您序列化的。所发生的(我认为)是Protobuf对象定义了一个uu getstate_uuu()方法,该方法返回您看到的Protobuf对象的序列化形式。与此相反的是uu setstate_uuuu(…)(这些方法是从Python内置的pickle序列化程序机制‘借用’来的)。我没有使用protobufs的经验,但我猜很简单:
会成功的。我建议您查看protobuf的文档,了解它们的对象是如何序列化的(您可能需要搜索它们是如何被pickle的)。底线:这不是火神(或蛇)所能控制的。你知道吗
相关问题 更多 >
编程相关推荐