在类方法中序列化类实例后反序列化出现UnicodeDecodeError的问题咨询
在类方法中序列化类实例后反序列化出现UnicodeDecodeError的问题咨询
嗨,我来帮你排查这个问题~ 你遇到的UnicodeDecodeError其实是个很常见的小疏忽,咱们先拆解问题的核心原因,再给出解决办法:
问题根源:文件打开模式不匹配
你用dill.dump()序列化时用的是二进制写入模式"wb",这部分是正确的;但在加载时却用了文本读取模式"r",Python会尝试用系统默认的文本编码去解析二进制序列化数据,自然就会触发解码失败的错误。
错误代码点
你当前的加载逻辑:
with open('C:/my_rose.dill', "r") as dill_file: rose_from_file = dill.load(dill_file)
修正后的加载代码
只需要把文件打开模式改成二进制读取模式"rb"即可:
with open('C:/my_rose.dill', "rb") as dill_file: rose_from_file = dill.load(dill_file)
额外补充说明
- 你之前疑惑的「能不能在类内部序列化自己」是完全可行的!你的
get_water_frequency方法里调用self.save()的逻辑没有任何问题,刚才的错误和这个逻辑无关,只是加载环节的文件模式用错了。 - 验证修正效果:你可以正常调用
my_rose.get_water_frequency(save_path='C:/my_rose.dill')触发实例保存,之后用修正后的加载代码就能成功恢复实例。
完整可运行的修正代码
import dill class Plant: def __init__(self, name, height): self.name = name self.height = height def get_water_frequency(self,save_path=None): # 任务执行前保存实例的逻辑完全成立 if save_path is not None: self.save(path=save_path) if self.height>3: water_frequency=2 else: water_frequency=3 return water_frequency def save(self,path): with open(path, "wb") as dill_file: dill.dump(self, dill_file) return # 测试实例保存与加载 my_rose = Plant('White Rose',4) # 两种保存方式都能正常工作 my_rose.save('C:/my_rose.dill') # 或者通过业务方法触发保存:my_rose.get_water_frequency(save_path='C:/my_rose.dill') # 正确加载实例 with open('C:/my_rose.dill', "rb") as dill_file: rose_from_file = dill.load(dill_file) # 验证恢复结果 print(rose_from_file.name) # 输出: White Rose print(rose_from_file.height) # 输出: 4 print(rose_from_file.get_water_frequency()) # 输出: 2
这样运行就完全没问题啦,你之前的误解是因为错误和类内部序列化的逻辑无关,只是文件操作的小疏忽导致的~
备注:内容来源于stack exchange,提问作者user13132640
相关产品推荐
相关产品推荐

