Я обновляю некоторый код для использования Pyro5 (из Pyro3) и не понимаю, как обращаться с пользовательскими объектами, возвращаемыми из метода, доступ к которому осуществляется через прокси-сервер Pyro. В качестве демонстрации я создал два простых класса в файле classs.py: В Container есть метод, который возвращает экземпляр Item:
Код: Выделить всё
from Pyro5.api import expose
class Container:
@expose
def get_item(self):
return Item()
class Item():
def __str__(self):
return "item"
Пакет serpent может сериализовать и десериализовать объекты типа Item:-
Код: Выделить всё
import serpent
from classes import Item
item = Item()
s = serpent.dumps(item)
item2 = serpent.loads(s)
print(item2)
Запуск этого распечатывает, как и ожидалось:
Теперь я создаю демон Pyro5 и регистрирую экземпляр Container:
Код: Выделить всё
from Pyro5.api import Daemon
from classes import Container
daemon = Daemon(host="localhost", port=5555)
daemon.register(Container(),"container")
daemon.requestLoop()
Но когда я пытаюсь получить экземпляр Item через прокси, вот так
Код: Выделить всё
from Pyro5.api import Proxy
container = Proxy("PYRO:container@localhost:5555")
print(container.get_item())
Я получаю исключение
Код: Выделить всё
Pyro5.errors.SerializeError: unsupported serialized class: classes.Item
Если get_item() изменен на возврат строки, все в порядке. Есть ли способ сериализовать и десериализовать мой класс Item без большого количества дополнительного пользовательского кода? Поскольку змей справляется с этим нормально и используется Pyro5, кажется, это не должно быть слишком сложно!
Подробнее здесь:
https://stackoverflow.com/questions/781 ... get-object