Pyro4:反序列化protobuf类

2024-10-16 20:47:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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消息实例。你知道吗

似乎这一定是一个常见的、琐碎的操作,但是我找不到一个好的示例来演示,而且文档并没有提供我能看到的明确的帮助。你知道吗

谢谢你!你知道吗


Tags: 对象实例importself属性序列化defsetup
2条回答

它确实是从我看到的protobuf中序列化的。对confucion进行排序后,我发现序列化的结果是unicode。为了使protobuf能够反序列化结果,我需要将其编码为纯ascii(使用<result>.encode('utf-8'))。我不知道为什么它会返回unicode,它以后不会返回并接受它。不过,我有一个可行的解决方案。你知道吗

默认情况下,Pyro使用Serpent序列化程序,而Serpent序列化程序又使用python的基元类型将内容序列化为。通常这是一本字典。如果它是一个不容易识别的类,或者该类没有定义“合适的”序列化方法,它将返回到一个特殊的字典形式,例如:

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

你看不到这个在你的序列化形式。这意味着它不是Pyro(或者说蛇)为您序列化的。所发生的(我认为)是Protobuf对象定义了一个uu getstate_uuu()方法,该方法返回您看到的Protobuf对象的序列化形式。与此相反的是uu setstate_uuuu(…)(这些方法是从Python内置的pickle序列化程序机制‘借用’来的)。我没有使用protobufs的经验,但我猜很简单:

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

会成功的。我建议您查看protobuf的文档,了解它们的对象是如何序列化的(您可能需要搜索它们是如何被pickle的)。底线:这不是火神(或蛇)所能控制的。你知道吗

相关问题 更多 >