Python pickle反序列化类实例时出现Property object at 0x错误如何解决?
问题根因
你在要序列化的TCPmodule实例中存储了socket套接字对象,套接字属于操作系统级资源,不支持pickle序列化,会导致整个实例的序列化/反序列化过程异常:原本属于类级别的@property装饰器属性被错误当成实例属性序列化,反序列化后实例直接持有header、user等property对象,访问时不会触发getter逻辑返回底层的_header、_user值,就会出现你看到的Property object at 0x输出。
解决方案
- 第一步:移除
TCPmodule中不需要序列化的socket属性
你不需要把客户端的socket传给服务端,服务端本身持有对应的客户端连接套接字,直接删除withSocket方法中self.socket = socket这行即可,避免不可序列化对象干扰整个序列化流程。 - 第二步:补充
TCPmodule的初始化方法,显式声明底层存储属性
给类添加__init__方法提前初始化带下划线的私有属性,避免反序列化时属性缺失:class TCPmodule: def __init__(self): self._header = "" self._content = "" self._user = "" self.port = 0 def withSocket(self, header, content, socket): self.header = header self.content = content # 删掉socket赋值逻辑 # self.socket = socket self.user = "" self.port = 0 return self # 原有@property相关代码保持逻辑不变 - 第三步:确保服务端和客户端的
TCPmodule类定义完全一致
两端必须都保留完整的@property装饰器定义,不能出现一端有property、另一端直接用普通属性的情况。
验证方法
修改完成后,服务端反序列化后可以临时加一行打印print(message._header),如果能正常输出预期的user-login字符串,说明修复成功,后续直接用message.header访问即可。
内容的提问来源于stack exchange,提问作者chocreme
相关产品推荐
相关产品推荐

