首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >序列化python对象和类定义

序列化python对象和类定义
EN

Stack Overflow用户
提问于 2015-01-14 06:19:46
回答 2查看 523关注 0票数 0

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

代码语言:javascript
复制
# 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实例的客户端

代码语言:javascript
复制
# 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也有类似的东西吗?也许是一些框架,可以将对象与类字节码一起序列化,让客户端拥有一个完整的类实例?

EN

回答 2

Stack Overflow用户

发布于 2015-01-14 08:02:18

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

Pyro不会为您做的是传递组成模块定义的实际字节码,即使在使用pickle序列化程序时也是如此。在您的示例中,客户端必须能够以常规方式导入定义类的模块。没有密码传输。

票数 0
EN

Stack Overflow用户

发布于 2015-02-11 19:33:17

您可以考虑使用

代码语言:javascript
复制
payload = CPickle.dump(Greeter(name))

在服务器端和客户端,一旦接收到有效负载,就执行以下操作:

代码语言:javascript
复制
h = CPickle.load(payload)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27932550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档