序列化 python 对象和类定义

Posted

技术标签:

【中文标题】序列化 python 对象和类定义【英文标题】:Serialize python objects along with class definition 【发布时间】:2015-01-13 22:19:46 【问题描述】:

我正在尝试了解如何使用 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())

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

可以考虑使用

payload = CPickle.dump(Greeter(name))

在服务器端和客户端收到有效负载后执行 -

h = CPickle.load(payload)

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

【讨论】:

以上是关于序列化 python 对象和类定义的主要内容,如果未能解决你的问题,请参考以下文章

保存数据到文件的模块(configparser,json,pickle,shelve,xml)_python

Java关键字-transient

Python标准库:pickle

javad对象序列化(转)

Java对象序列化

Java序列化与对象流浅谈