Pyro4:反序列化protobuf类

时间:2019-01-14 08:38:54

标签: python protocol-buffers pyro4

我对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消息实例。

这似乎是一个普通的,微不足道的操作,但是我找不到一个很好的例子来展示给我,文档也没有提供我可以看到的明确帮助。

谢谢!

2 个答案:

答案 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,此后它不会转身接受。但是,我有一个可行的解决方案。

相关问题