You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在类方法中序列化类实例后反序列化出现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)

额外补充说明

  1. 你之前疑惑的「能不能在类内部序列化自己」是完全可行的!你的get_water_frequency方法里调用self.save()的逻辑没有任何问题,刚才的错误和这个逻辑无关,只是加载环节的文件模式用错了。
  2. 验证修正效果:你可以正常调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:44:37