我想序列化一个将套接字对象作为值的字典,但是我无法正常工作。
这是我的代码:
self.client_dictionary[username] = socket.socket() # update dictionary
file = open('client_sockets.pickle','wb')
pickle.dump(self.client_dictionary, file) #here is where the error is
file.close()
但是我收到以下错误消息:
File "D:\Users\saunfe\AppData\Local\Programs\Python\Python35-
32\lib\socket.py",
line 175, in __getstate__ raise TypeError("Cannot serialize socket object")
TypeError: Cannot serialize socket object
答案 0 :(得分:1)
不能腌制套接字对象。 pickle module的文档说明了可以腌制的类型:
可以腌制以下类型:
无,真与假
整数,浮点数,复数
字符串,字节,字节数组
仅包含可拾取对象的元组,列表,集合和词典
在模块顶层定义的功能(使用def,而不是lambda)
- 在模块顶层定义的
在模块顶层定义的内置函数
- 此类{<1>}或调用
类
__dict__
的结果是可腌制的类的实例(有关详细信息,请参见“腌制类实例”一节)。
现在__getstate__()
对象不是这些类型中的任何一个,甚至没有socket
(并且它的__dict__
抱怨不能腌制)。
从您编写问题的方式出发,您最有可能希望腌制套接字的客户端连接,而不是套接字本身。由于您有一个 empty 套接字(通过查看代码片段),因此您应该将参数腌制到套接字构造函数中,如下所示:
__getstate__()
如果套接字调用具有诸如`socket(family = socket.AF_INET,type = socket.SOCK_STREAM,proto = 0)之类的参数,则可以改用此字典:
from socket import socket
import pickle
socket_args = {}
self.client_dictionary[username] = socket_args # update dictionary
file = open('client_sockets.pickle','wb')
pickle.dump(self.client_dictionary, file)
file.close()
# ...
# file open and load omitted for brevity
socket_args = self.client_dictionary[username]
socket_object = socket(**socket_args)