序列化python对象以及类定义

时间:2015-01-13 22:19:46

标签: python rpc pyro

我正在尝试了解如何使用Python进行RPC调用。我有一个愚蠢的服务器,它定义一个类并公开一个创建该类实例的方法:

# server.py
class Greeter(object):
    def __init__(self, name):
        self.name = name
    def greet(self):
        return "Hi {}!".format(self.name)

def greeter_factory(name):
    return Greeter(name)

some_RPC_framework.register(greeter_factory)

以及想要获取Greeter的实例的客户端:

# client.py
greeter_factory = some_RPC_framework.proxy(uri_given_by_server)

h = greeter_factory("Heisemberg")
print("Server returned:", h.greet())

问题是我找不到允许返回用户定义对象实例的框架,或者只返回带有对象属性的dict的框架(例如,Pyro4)。

过去我使用过Java RMI,您可以在服务器上指定代码库,客户端可以根据需要下载已编译的类。 Python有这样的东西吗?也许某些框架可以将对象与类字节码一起序列化,让客户端拥有一个完整的类实例?

2 个答案:

答案 0 :(得分:0)

Pyro可以在一定程度上做到这一点。使用默认序列化程序时,可以注册自定义类(反)序列化程序。或者您可以决定使用pickle序列化程序,但这会产生严重的安全隐患。见http://pythonhosted.org/Pyro4/clientcode.html#serialization

即使使用pickle序列化程序,Pyro也不会为你做的是传输组成模块定义的实际字节码。在您的情况下,客户端必须能够以常规方式导入定义类的模块。没有代码传输。

答案 1 :(得分:0)

您可以考虑使用

payload = CPickle.dump(Greeter(name))
一旦收到有效载荷,

在服务器端和客户端上 -

h = CPickle.load(payload)

获取服务器已创建的Greeter对象的实例。