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
相关产品推荐
相关产品推荐

