如何在python中使用pickle序列化套接字对象

时间:2019-01-20 18:14:35

标签: python-3.x

我想序列化一个将套接字对象作为值的字典,但是我无法正常工作。

这是我的代码:

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

1 个答案:

答案 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)