Python对象如何实现序列化_利用pickle与json模块持久化类实例

夜瑶同学_8309

夜瑶同学_8309

2026-04-21

217人浏览

原创

python类实例不能直接用json序列化,因其仅支持内置类型;pickle虽可直接序列化绝大多数实例,但仅限python环境且存在安全风险。

python对象如何实现序列化_利用pickle与json模块持久化类实例

Python 类实例不能直接用 json 序列化,除非你主动控制其结构;而 pickle 能直接序列化绝大多数实例,但只适用于 Python 环境内可信数据交换。

为什么 json.dumps(obj) 会报 TypeError: Object of type XXX is not JSON serializable

因为 json 模块只认内置类型(dict、list、str、int、float、bool、None),不理解自定义类的结构。它不会自动调用 __dict__ 或任何方法来推导可序列化形式。

  • 常见错误:直接传入一个 User(name="Alice", age=30) 实例给 json.dumps()
  • 可行解法:手动转成字典,例如 json.dumps(obj.__dict__) —— 但要注意 __dict__ 不包含属性(property)、不包含父类未显式赋值的字段、也不处理循环引用
  • 更稳妥的方式是定义 to_dict() 方法或继承 json.JSONEncoder 并重写 default()

用 pickle 保存和恢复实例最简路径

pickle 是 Python 原生序列化协议,能直接处理函数、类、模块引用和内存对象图(包括嵌套、循环引用)。但它生成的字节流无法被其他语言读取,且反序列化不受信数据有任意代码执行风险。

Wjs Uploading Video
Wjs Uploading Video

将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。

下载
  • 保存:用 open("data.pkl", "wb") + pickle.dump(obj, f)
  • 恢复:用 open("data.pkl", "rb") + pickle.load(f)
  • 注意:被序列化的类定义必须在反序列化时的模块路径下可导入(即类不能是 __main__ 中临时定义的,否则报 AttributeError: Can't get attribute 'XXX' on <module></module>)
  • 如果类有 __slots__,pickle 默认支持;但若自定义了 __getstate__ / __setstate__,需确保逻辑正确,否则状态丢失

何时该选 json,何时必须用 pickle

选 json 当你需要跨语言、可读性强、只存简单数据结构(比如配置、API 返回体);选 pickle 当你要完整保留对象行为依赖(如绑定方法、闭包、非 POD 类型),且运行环境完全可控。

  • json:适合保存 dataclass 或 NamedTuple 的扁平数据,配合 dataclasses.asdict() 很干净
  • pickle:适合缓存训练好的 sklearn 模型、保存带回调函数的 GUI 对象、序列化协程状态等
  • 性能上:pickle(尤其是 protocol 5+)通常比 json 快,但体积不一定小;json 文本可压缩性更好
  • 兼容性陷阱:pickle 版本不兼容(如用 Python 3.12 的 pickle 写出的数据,在 3.9 上可能 load 失败),务必固定 protocol(如 pickle.dump(obj, f, protocol=4))

真正容易被忽略的是:类名变更、模块移动、甚至只是把类从 foo.py 剪切到 bar.py,都会让旧的 pickle 文件失效——这不是 bug,是设计使然。而 json 虽安全,却要求你始终维护“对象 ↔ 字典”的映射契约,漏掉一个字段或类型转换错一次,加载时就静默丢数据。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1731

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4404

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1709

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

25737

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3127

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3147

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1183

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2443

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程