Python对象序列化方法_pickle与json说明【指导】

发布时间 - 2025-12-31 00:00:00    点击率:
Python序列化选pickle或json取决于场景:pickle支持任意Python对象但不安全、不可跨语言;json安全、跨语言但仅支持基础类型。内部临时存储用pickle,外部交互用json。

Python中序列化对象主要有 picklejson 两种方式,它们用途不同、限制不同、安全性也不同。选错方法可能导致数据无法还原、程序崩溃,甚至被恶意利用。

pickle:Python专属的二进制序列化

pickle 是 Python 原生支持的序列化模块,能保存几乎任意 Python 对象(函数、类实例、嵌套结构等),但只适用于 Python 环境内部使用。

  • 生成的是二进制数据(也可用文本协议,但默认不推荐),不能直接阅读或跨语言交换
  • 反序列化时会执行任意代码(如构造器、__setstate__),绝不能加载不可信来源的 pickle 数据
  • 不同 Python 版本间兼容性有限,高版本 pickle 的数据可能无法被低版本读取
  • 常用方法:pickle.dump(obj, file)pickle.load(file)pickle.dumps(obj)pickle.loads(bytes)

json:轻量、安全、跨语言的文本序列化

json 模块将数据转为标准 JSON 格式(纯文本),天然支持 Web 交互和多语言协作,但只支持基础数据类型。

  • 仅支持 dictliststrintfloatboolNone 这几种类型;自定义类、函数、datetime、bytes 等需手动转换
  • 天生安全:反序列化不会执行代码,适合处理外部输入(如 API 返回、用户上传)
  • 生成结果人类可读,便于调试和日志记录
  • 常用方法:json.dump(obj, file)json.load(file)json.dumps(obj)json.loads(str)

怎么选?看场景和数据类型

如果只是临时保存 Python 内部状态(如缓存、进程间传递),且完全控制数据来源,用 pickle 更省事;如果要存配置、传 API、写日志、或与前端/其他语言交互,必须用 json

  • 想保存一个 datetimejson 默认不支持,得先转成字符串(如 dt.isoformat()),读取时再解析
  • 想保存一个带方法的类实例?json 不行,pickle 可以,但要注意版本和安全性
  • 从网页表单接收 JSON 数据?只能用 json.loads(),用 pickle.loads() 会报错甚至引发漏洞

小技巧:让 json 支持更多类型

通过 default 参数和自定义 JSONEncoder,可以让 json 处理常见扩展类型。

  • 例如把 datetime 自动转为 ISO 字符串:json.dumps(obj, default=str)(简单粗暴,适用多数情况)
  • 更精确的做法是继承 json.JSONEncoder,重写 default 方法,对不同类型做针对性处理
  • 反序列化时没有内置机制,需在业务逻辑里手动识别字段并转换(如检测 "created_at" 字段后调用 datetime.fromisoformat()


# python  # js  # 前端  # json  # 多语言 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 再谈Python中的字符串与字符编码(推荐)  如何用搬瓦工VPS快速搭建个人网站?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  潮流网站制作头像软件下载,适合母子的网名有哪些?  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  如何续费美橙建站之星域名及服务?  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  如何快速生成可下载的建站源码工具?  Swift中swift中的switch 语句  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  Linux网络带宽限制_tc配置实践解析【教程】  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  UC浏览器如何设置启动页 UC浏览器启动页设置方法  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  JavaScript如何操作视频_媒体API怎么控制播放  香港服务器选型指南:免备案配置与高效建站方案解析  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  微信小程序 闭包写法详细介绍  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  Laravel如何配置Horizon来管理队列?(安装和使用)  Android利用动画实现背景逐渐变暗  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  网站制作壁纸教程视频,电脑壁纸网站?  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  实现点击下箭头变上箭头来回切换的两种方法【推荐】  Laravel怎么为数据库表字段添加索引以优化查询  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  简单实现Android验证码  bootstrap日历插件datetimepicker使用方法  Laravel如何集成Inertia.js与Vue/React?(安装配置)  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  历史网站制作软件,华为如何找回被删除的网站?  个人网站制作流程图片大全,个人网站如何注销?  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  HTML 中如何正确使用模板变量为元素的 name 属性赋值  Android okhttputils现在进度显示实例代码  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  JS碰撞运动实现方法详解  html如何与html链接_实现多个HTML页面互相链接【互相】  制作电商网页,电商供应链怎么做?  如何注册花生壳免费域名并搭建个人网站?  如何在云虚拟主机上快速搭建个人网站?