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

Python自定义类对象列表序列化存txt反序列化恢复原对象方法

问题原因

当前反序列化逻辑直接将JSON解析出的字典传入SimpleNamespace构造,最终得到的必然是SimpleNamespace实例,全程没有调用自定义Test类的构造方法,自然无法还原为原类型对象。另外现有编解码方法绑定在Test类实例上的设计不合理,处理对象列表不需要依赖单个Test实例,循环变量命名为self也会造成语义混淆。

最小改动修复方案

只需要调整反序列化时的对象构造逻辑,将SimpleNamespace替换为Test类实例化即可,同时修正方法定义的不合理之处,可直接运行的代码如下:

import json

class Test():
    def __init__(self, var, var2):
        self.var = var
        self.var2 = var2

    @staticmethod
    def dictionaryEncoder(contenuto):
        # 遍历对象列表提取属性字典,避免用self做循环变量
        json_string = json.dumps([obj.__dict__ for obj in contenuto])
        return json_string

    @staticmethod
    def dictionaryDecoder(letto):
        # 核心修改:字典拆包传入Test类构造,替换原SimpleNamespace逻辑
        pyLetto = json.loads(letto, object_hook=lambda d: Test(**d))
        return pyLetto


# 功能验证
if __name__ == "__main__":
    original_objs = [Test(1, 11), Test(2, 22), Test(3, 33), Test(4, 44)]
    print("原始对象列表:", original_objs)
    
    # 序列化写入txt
    json_content = Test.dictionaryEncoder(original_objs)
    with open("obj_save.txt", "w", encoding="utf-8") as f:
        f.write(json_content)
    
    # 从txt读取反序列化
    with open("obj_save.txt", "r", encoding="utf-8") as f:
        loaded_content = f.read()
    decoded_objs = Test.dictionaryDecoder(loaded_content)
    print("反序列化后对象列表:", decoded_objs)
    print("反序列化对象类型校验:", [type(obj) for obj in decoded_objs])

运行后反序列化得到的就是标准的Test类实例,可以正常执行属性修改、类方法调用等操作。

更优实现参考

根据实际使用场景可以选择更适配的方案,不需要手动硬编写解码逻辑:

  • 仅在Python环境内使用、不需要跨语言/人工读序列化内容的场景,直接用标准库pickle即可,零额外代码就能完成任意Python对象的序列化和还原,注意不要加载不可信来源的pickle文件,避免恶意代码执行风险,示例代码:
import pickle

original_objs = [Test(1, 11), Test(2, 22), Test(3, 33)]
# 存文件
with open("obj_cache.bin", "wb") as f:
    pickle.dump(original_objs, f)
# 读文件还原
with open("obj_cache.bin", "rb") as f:
    loaded_objs = pickle.load(f)
  • 需要存为可读JSON、跨语言传输的场景,如果类后续会迭代增加属性、或者包含时间、自定义嵌套类型等非JSON原生支持的属性,不要直接取__dict__做序列化,单独实现to_dict、from_dict方法做显式转换,避免类结构变动后编解码报错。
  • 项目中存在大量类似数据类定义的场景,可以用标准库dataclasses装饰器定义类,配合dataclasses.asdict做序列化,反序列化时直接拆包传参,代码更简洁规范。

内容的提问来源于stack exchange,提问作者devLeo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:15:43