Serialization Python不会序列化未在套接字中导入的对象
我编写了以下简单的套接字应用程序,其中对象在单独的文件中定义,并且可以工作Serialization Python不会序列化未在套接字中导入的对象,serialization,pickle,python-import,python-sockets,Serialization,Pickle,Python Import,Python Sockets,我编写了以下简单的套接字应用程序,其中对象在单独的文件中定义,并且可以工作 # models_object.py class Person(object): def __init__(self,name,surname,age): self.name = name self.surname = surname self.age = age def __str__(self): return self.nam
# models_object.py
class Person(object):
def __init__(self,name,surname,age):
self.name = name
self.surname = surname
self.age = age
def __str__(self):
return self.name + " " + self.surname
但是,如果我将
Person
类定义写入client.py
,代码将引发以下错误
Traceback (most recent call last):
File "service.py", line 14, in <module>
server()
File "service.py", line 11, in server
print cPickle.loads(recieved_data)
AttributeError: 'module' object has no attribute 'Person'
回溯(最近一次呼叫最后一次):
文件“service.py”,第14行,在
服务器()
服务器中第11行的文件“service.py”
打印cPickle.loads(接收的数据)
AttributeError:“module”对象没有属性“Person”
导入和序列化之间有关系吗
注意:我们从以下位置尝试了python 2.7:
请注意,函数(内置和用户定义)是通过“完全限定”名称引用而不是通过值进行pickle的。这意味着只有函数名与定义函数的模块名一起被pickle。函数的代码及其任何函数属性都不会被pickle。因此,定义模块必须在取消勾选环境中可导入,并且该模块必须包含命名对象,否则将引发异常
这意味着您在服务器中取消勾选的对象也应该可以从服务器代码导入,在第一个示例中,该代码为:model\u objects.Person
。在第一种情况下,如果您尝试将client.py
和model\u对象.py
拆分到一个文件夹中,并将service.py
拆分到另一个文件夹中,这在第一种情况下很明显,这将给您带来与在service.py
中尝试导入model\u对象.py
相同的错误,但它找不到它
因此,在第二种情况下,您可以将类Person也复制到服务器代码中,这将起作用,但这是一种不好的做法,或者为客户端和服务器创建一个共享文件夹,这也是共享的生产代码(更好的做法)
这是因为在解除锁定期间,python需要对象的类来重新实例化对象并使用它
#service.py
import cPickle,socket
def server():
server = socket.socket()
host = socket.gethostname()
port = 8000
server.bind((host, port))
server.listen(1)
connection, address = server.accept()
recieved_data = connection.recv(2**20)
print cPickle.loads(recieved_data)
connection.close()
server()
Traceback (most recent call last):
File "service.py", line 14, in <module>
server()
File "service.py", line 11, in server
print cPickle.loads(recieved_data)
AttributeError: 'module' object has no attribute 'Person'