Pyro4:反序列化 protobuf class

Pyro4: Deserializing protobuf class

我对 Pyro4 完全陌生。我希望提供一个 python class ,其中包含一个属性,该属性是编译为 python class.

的 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) 了解到 "By default, custom classes are serialized into a dict. They are not deserialized back into instances of your custom class."

我正在寻找说明,或描述如何将这个序列化字典转回我的 class 的示例,包括 class 包含的 protobuf 消息实例。

看来这一定是一个常见的、微不足道的操作,但我找不到一个好的例子来展示给我看,文档也没有提供我能看到的明确帮助。

谢谢!

默认情况下,Pyro 使用 Serpent 序列化程序,后者又使用 python 的原始类型将内容序列化为。通常这将是一本字典。如果它是一个不容易识别的 class 或者 class 没有定义 "suitable" 序列化方法,它将回退到一个特殊的字典形式,例如:

{
    "__class__":   "pakcage.Classname"
    "property1":   "value1",
    ...
}

您在序列化表单中看不到这一点。这意味着不是 Pyro(或者更确切地说是 Serpent)为您序列化了它。发生的事情(我认为)是 Protobuf 对象定义了一个 __getstate__() 方法,该方法 returns 您看到的 protobuf 对象的序列化形式。与此相反的是 __setstate__(...)(这些方法来自 Python 的内置 pickle 序列化器机制 'borrowed')。我没有使用 protobufs 的经验,但我的猜测是一个简单的:

u = proxy.MyProtoBuf
message = mpb.MyProtobufMessage()   # create empty protobuf object (??)
message.__setstate__(u)

会成功的。我建议您查看 protobuf 的文档,了解它们的对象是如何序列化的(您可能需要搜索它们是如何被腌制的)。底线;这不是 Pyro(或蛇)可以控制的东西。

它确实是从我看到的 protobuf 序列化的。一旦那个confucion被排序,我发现序列化的结果是unicode。为了能够让 protobuf 反序列化结果,我需要将其编码为纯 ascii(使用 <result>.encode('utf-8'))。我不确定为什么它会返回 unicode,此后它不会转身接受。不过,我有一个可行的解决方案。