使用Pyro5代理获取对象时遭遇“Unsupported serialized class”错误
Pyro5自定义对象序列化问题的简易解决方法
Pyro5对自定义类的序列化有严格的白名单机制,即使serpent能处理该类,Pyro5也需要明确知晓该类允许被序列化,以下是两种无需大量自定义代码的解决方式:
方法一:使用@expose装饰器标记自定义类
直接给Item类添加@expose装饰器,告诉Pyro5该类可以被序列化:
修改classes.py:
from Pyro5.api import expose class Container: @expose def get_item(self): return Item() @expose class Item(): def __str__(self): return "item"
方法二:注册类到Pyro5序列化器
如果不想给类添加@expose,可以在服务端和客户端的代码中,将Item类注册到Pyro5的序列化器:
服务端修改(启动守护进程前添加):
from Pyro5.api import Daemon, SerializerBase from classes import Container, Item SerializerBase.register_class_to_serialize(Item) daemon = Daemon(host="localhost", port=5555) daemon.register(Container(),"container") daemon.requestLoop()
客户端修改(创建代理前添加):
from Pyro5.api import Proxy, SerializerBase from classes import Item SerializerBase.register_class_to_serialize(Item) container = Proxy("PYRO:container@localhost:5555") print(container.get_item())
原理说明
Pyro5默认仅序列化内置类型和标记了@expose的类,通过上述两种方式,将Item类纳入Pyro5的序列化白名单后,就能借助serpent完成自动的序列化与反序列化,解决SerializeError异常。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

