Python 中的序列化与反序列化:pickle与json 的应用与区别

文章目录

  • Python 中的序列化与反序列化:pickle与json 的应用与区别
  • pickle与 json模块的基本介绍
    • json模块:跨语言的数据交换
    • pickle模块:Python 特有的数据存储
  • pickle 和 json的序列化与反序列化示例
    • 使用 pickle进行序列化与反序列化:
    • 使用 json 进行序列化与反序列化:
  • 性能对比与选择
  • 安全性问题
  • 结论:如何选择?
  • 小结


Python 中的序列化与反序列化:pickle与json 的应用与区别

在 Python 中,序列化(serialization)是将 Python 对象转换为可存储或传输的格式,反序列化(deserialization)则是将存储或传输的格式恢复为 Python 对象。两种常见的序列化方式是通过 picklejson 模块实现的。尽管它们都能实现相同的目标,但其用途、性能、以及安全性等方面存在显著差异。

pickle与 json模块的基本介绍

json模块:跨语言的数据交换

json(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于 web 开发和不同语言之间的数据传输。Python 的 json 模块提供了将 Python 对象转换为 JSON 字符串的功能,同时也支持将 JSON 字符串转换为 Python 对象。

  • 适用范围json 主要用于基本数据类型(如字符串、数字、字典、列表等)的序列化和反序列化。它是一种跨语言的标准格式,因此广泛用于与其他编程语言的数据交换。

pickle模块:Python 特有的数据存储

pickle 是 Python 内建的模块,用于将 Python 对象转换为字节流(即二进制形式),并将其存储到文件中或传输到网络中。与 json 不同,pickle 可以序列化更为复杂的数据类型,包括自定义对象、函数、甚至模块。

  • 适用范围pickle 主要用于 Python 内部的持久化存储或进程间通信(IPC)。它不能直接与其他编程语言交换数据,因为其他语言并不理解 pickle 格式。

pickle 和 json的序列化与反序列化示例

我们通过两个模块的具体代码示例来了解它们的使用。

使用 pickle进行序列化与反序列化:

import pickle# 创建一个包含自定义对象的列表
data = {'name': 'Alice', 'age': 30, 'is_student': False}# 将 Python 对象序列化为二进制格式
with open('data.pickle', 'wb') as f:pickle.dump(data, f)# 从文件中反序列化数据
with open('data.pickle', 'rb') as f:loaded_data = pickle.load(f)print(loaded_data)  # 输出: {'name': 'Alice', 'age': 30, 'is_student': False}

在这个示例中,我们将一个字典对象序列化到文件 data.pickle 中,并通过 pickle.load() 将其反序列化为原始 Python 数据结构。

使用 json 进行序列化与反序列化:

import json# 创建一个字典对象
data = {'name': 'Bob', 'age': 25, 'is_student': True}# 将 Python 对象转换为 JSON 字符串
json_str = json.dumps(data)
print(json_str)  # 输出: {"name": "Bob", "age": 25, "is_student": true}# 将 JSON 字符串转换回 Python 对象
loaded_data = json.loads(json_str)
print(loaded_data)  # 输出: {'name': 'Bob', 'age': 25, 'is_student': True}

在这个示例中,我们将一个字典对象转换为 JSON 格式的字符串,再通过 json.loads() 方法将其转换回原始的 Python 数据结构。

性能对比与选择

在大多数情况下,json 的性能略优于 pickle,尤其是在序列化和反序列化较简单的数据类型时。json 格式的字符串相对较轻,不包含任何额外的元数据,因此在传输和存储时更为高效。然而,pickle 可以序列化更加复杂的 Python 对象,适用于需要保存 Python 特有类型(如类实例、函数等)的场景。

如果你只是需要存储和传输简单的数据(如字符串、列表、字典等),那么 json 是更好的选择。而如果你的数据结构非常复杂,且需要存储 Python 特有的数据类型,pickle 更为适合。

安全性问题

尽管 pickle 在功能上比 json 更强大,但它存在一个重大的安全问题。如果你从不可信来源加载 pickle 数据,可能会遭遇代码执行漏洞。因为 pickle 在反序列化过程中可以执行对象中的 __reduce__() 方法,这可能会导致恶意代码的执行。

建议:对于不可信数据,始终避免使用 pickle.load(),如果需要处理外部数据,推荐使用 json 模块,或采用其他更安全的序列化方法。

结论:如何选择?

  • 如果你的目标是跨语言的数据交换或者需要将数据存储为标准格式,选择 json
  • 如果你需要处理 Python 特有的数据类型(如类实例、函数等),并且仅在 Python 环境中使用,选择 pickle
  • 考虑到安全性,尽量避免在不信任的环境中使用 pickle 进行反序列化。

小结

picklejson 模块各有优劣,适用于不同的场景。在实际开发中,选择合适的模块可以帮助你更高效地处理数据序列化与反序列化操作。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/15165.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

云服务器端口开放

云服务器一般除了必要端口,其它端口默认都是关闭的,要想进行网络通信就必须开放指定的端口。下面以腾讯云服务器为例来进行详细说明。 腾讯云的轻量服务器是没有安全组的,这里有的只是防火墙,开放端口也是通过防火墙来设置的。首先…

【CMake|TensorRT】Windows下使用CMake编译项目,yolov8-seg为例子

代码仓库: yolov8 trt CMakeLists.txt解析 首先指定cmake支持的最大版本,只要版本号小于我们下载的cmake版本即可: cmake_minimum_required(VERSION 3.20)指定我们项目的名称,随便取什么名字: project (yolov8-se…

Ruoyi导出excel,导出对象的子列表

说明:此文章是对ruoyi分离版后台功能,导出excel文件,导出对象的子列表的补充 若依文档: 后台手册 | RuoYi 导出文件结果 :::color4 补充文档场景: 如上图所示,角色中的字段“角色编号”,“…

MBR40150FCT-ASEMI大功率肖特基MBR40150FCT

编辑:ll MBR40150FCT-ASEMI大功率肖特基MBR40150FCT 型号:MBR40150FCT 品牌:ASEMI 封装:TO-247 正向电流:40A 反向电压:150V 正向压降:0.95V~1.90V 引线数量:3 芯片个数&am…

构建数字化诊断平台,助力服务商与企业共赢

在当今时代,全球信息化、网络化、智能化趋势日益明显,数字化转型已成为企业发展的必然选择。近年来,我国经济发展进入新常态,市场竞争愈发激烈,企业面临诸多挑战。因此,全国各地也在逐步且持续地推动和组织…

接口自动化测试框架搭建详解

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、基本目录的搭建 report:静态输出目录(报告或者日志) data:静态输入目录(可以存放Excel数据,被读取的一些数据) utils&…

找不到x3daudio1_7.dll无法继续执行代码怎么解决,共有七种方法

​在使用某些游戏或多媒体应用时,您可能会遇到“找不到X3DAudio1_7.dll”这样的错误提示。这个问题不仅会影响游戏的启动和音效质量,还可能引发其他系统性能问题。本文将全面解读X3DAudio1_7.dll丢失的原因、具体影响、解决方法以及预防措施,…

连接器上市企业观察:通讯利好,光储承压

【哔哥哔特导读】2024年已临近尾声,前三季度,29家连接器上市企业业绩如何?通讯、光伏、储能等器热门领域,连接器行业总体趋势相较上一年发生了什么变化? 10月份,连接器上市企业集中发布三季度业绩报告。《国际线缆与…

锂电池保护板行业分析与未来预测

锂电池保护板是对串联锂电池组的充放电保护;在充满电时能保证各单体电池之间的电压差异小于设定值(一般20mV),实现电池组各单体电池的均充,有效地改善了串联充电方式下的充电效果;同时检测电池组中各个单体…

企业u盘管控丨企业禁止U盘使用的5个小妙招分享!你最看好哪一个?

在企业日常运营中,U盘因其便携性和易用性,成为了数据传输的重要工具。 然而,若不对U盘使用加以严格管控,便可能引发数据泄露、病毒感染、管理混乱和资源滥用等一系列问题。 接下来,我们将分享五个企业禁止U盘使用的小…

Linux中扫描网络的“nmap”工具使用方法

0-介绍 在Linux中进行网络管理的最强大工具之一首推nmap。如果您想要扫描您的网络,查看哪些端口是开放的以及正在运行的服务,nmap是您的理想选择。注意手机上termux 中的用法一致。 1-什么是nmap? nmap属于网络映射器h工具,是一个用于扫描…

NVR小程序接入平台EasyNVR多品牌NVR管理设备:GB28181协议摄像头如何接入到EasyNVR中?

随着视频监控技术的不断进步,摄像头拉流技术已经成为现代安防系统中的关键组成部分。在众多拉流协议中,GB28181协议凭借其高安全性和设备兼容性,在大规模、跨区域的视频监控系统中展现出显著优势。本文将详细介绍如何将GB28181协议摄像头接入…

通胀降温遇到波动,美联储降息或成更大争议焦点

近期美国的通胀数据继续呈现出不均衡的走低趋势。尽管10月份的消费价格同比上涨略有回升,通胀整体走势依然显示出降温的迹象。根据最新报告,虽然通胀没有完全消退,但依然无法阻止市场对美联储在12月份可能再次降息的预期。不过,这…

不锈钢高速肉馅斩拌机:

不锈钢高速肉馅斩拌机通过斩切作用提高产品的细密度和弹性,广泛应用于肉制品的深加工制作,如机制作肉丸、香肠等。其工作原理是利用斩刀高速旋转的斩切作用,将原料进行斩切和乳化处理,从而提高产品的细腻度和弹性。斩拌机具有以下…

1.0版-结构化(经典)软件开发方法: 需求分析阶段+设计阶段

结构化软件开发方法: 特点: 面向数据流, 以数据流为中心构建软件的分析/设计模型 结构化分析模型:数据流图 结构化设计模型:结构图, 模块的程序流程图 1.建立结构化分析模型: 数据流图--DFD图 功能建模, 规约加工流程 实体关系图-ER图 数据建模, 对实体对象的描述 状态转换图-S…

C++基础:Pimpl设计模式的实现

2024/11/14: 在实现C17的Any类时偶然接触到了嵌套类的实现方法以及Pimpl设计模式,遂记录。 PIMPL ( Private Implementation 或 Pointer to Implementation )是通过一个私有的成员指针,将指针所指向的类的内部实现数据进行隐藏。 …

Intellij idea 报错:Error : java 不支持发行版本5

点击“Settings”-->“Bulid, Execution,Deployment”-->“Java Compiler”,Target bytecode version设为本地Java版本。(可以在Default Settings中把Project bytecode version 一劳永逸地配置成本地Java版本) Default Settings&#x…

物理验证Calibre LVS Stamping Conflict SoftConnect案例解析

最近有好几个星球会员问到物理验证Calibre LVS检查中的Stamping Conflict问题。小编今天给大家分享下Stamping冲突的相关topic。 Calibre PEX Hspice Netlist提取步骤(数模芯片提取spice netlist流程) Stamping Conflict概念 当不同的net对应的net sha…

TypeScript在现代前端开发中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 TypeScript在现代前端开发中的应用 TypeScript在现代前端开发中的应用 TypeScript在现代前端开发中的应用 引言 TypeScript 概述…

代码随想录训练营Day24 | 134. 加油站 - 135. 分发糖果 - 860.柠檬水找零 - 406.根据身高重建队列

134. 加油站 题目链接:134. 加油站 思路: 由题意可得,需要能够走完所有的加油站,就需要保证车到达每一个加油站的时候有油,故先对gas和cost数组做差,得到每个加油站的油差,正代表着车在这里能加…