这是我参与8月更文挑战的第4天,活动详情查看: 8月更文挑战
1. 前言概述
Python中,一切皆对象,对象本质上就是一个"存储数据的内存块"。
在日常运用中,我们有如下需求:
- 需要将内存块的数据保存在硬盘上
- 或者通过网络传输到其他的计算机上
面对如上需求,这个时候就需要对象的序列化和反序列化。
哪问题来了,小白摸摸头不懂序列化和反序列化?
-
序列化: 指的是将对象转化成串行化数据形式,存储到硬盘或者通过网络传输到其他地方
-
反序列化: 指相反的过程,将读取的串行化数据转化成对象
转化成串行数据形式:指将一个系统内的数据通过网络传输给其他系统前系统需要将数据转换成 字符串 或者 字节串 来进行传输
串行数据形式 :目前普遍使用比较多的数据格式有2种
- XML格式:早期使用的数据交换格式,通常用于前段时间网页传输数据
- JSON格式:目前流行的数据交换格式,前端请求后台数据通常采用JSON格式数据来进行接收
PS:概括一句话,序列化把数据转换成机器之间识别的格式,反序列化将文件转换成人类看得懂的格式。
注意:系统之间传输的数据格式是标准的,但是如果数据只存入硬盘上,没有统一格式,因此会受到编程语版本、转换协议等兼容性问题
对象序列化机制广泛应用在分布式并运行在系统上,目前支持序列化的模块有三个,分别是json模块、pickle模块和shelve模块
本期,我们将学习pickle模块中的函数,实现序列化和反序列操作~
2. pickle模块细节
pickle模块实现啦用Python对象结构进行序列化和反序列化的二进制协议。
pickle的序列化过程叫做picking,反序列化过程叫unpickling
- picking: 将数据对象转换成字节流过程
- unpickling: 将字节流二进制文件或者字节对象转换成数据对象过程
当前共有 6 种不同pickle协议可用于封存操作。
使用的协议版本越高,读取所生成 pickle 对象所需的 Python 版本就要越新
pickle模块特点:
- 可移植性:pickle文件格式独立于机器的体系结构。Linux系统下pickle序列化一份文档发送到MAC OS下,仍然会运行Python程序。pickle模块可以向后兼容Python各个版本。
- 支持多个变量引用同一个对象
- 缓冲机制:在 pickle 情形中,每个对象被恢复到一个与原来对象相等的对象,但不是同一个对象。换句话说,每个 pickle 都是原来对象的一个副本;
- pickle不支持文件对象(任何带有对文件对象引用的对象)
3. pickle模块相关方法
pickle模块是python专用的持久化模块,可以持久化包括自定义类在内的各种数据;只能在python程序之间进行数据交换;
方法 | 作用 |
---|---|
pickle.dumps(obj) | 将对象序列化成bytes对象 |
pickle.dump(obj,file) | 将对象序列化到文件对象,存入文件 |
pickle.load(file) | 从打开的文件中字节对象反序列化 |
pickle.loads(data) | 从字节对象反序列化之后,返回data对象 |
注意:
- 在使用dump()序列化时候,打开文件必须要以wb模式,使用load()反序列化,打开文件必须以rb模式
- 序列化与反序列化必须保证使用同一套类的定义,否则会带来不可预料的结果
我们来看看pickle模块对数据进行序列化和反序列化的基本操作:
>>> import pickle
>>> dic = {"name":"Juejin","time":8}
>>> data = pickle.dumps(dic)
>>> type(data)
<class 'bytes'>
>>> data
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x06\x00\x00\x00Juejinq\x02X\x04\x00\x00\x00timeq\x03K\x08u.'
>>> dic2 =pickle.loads(data)
>>> dic2
{'name': 'Juejin', 'time': 8}
>>> type(dic2)
<class 'dict'>
>>>
总结
本期,我们学习了Python对数据进行序列化和反序列化模块之一的pickle模块,pickle模块提供了dumps()、dump()函数进行对数据序列化为二进进制格式,load()、loads()函数对字节对象反序列化操作。
同时,pickle模块随着Python版本的升级,支持的功能也会更加强大。
以上是本期内容,欢迎大佬们点赞评论ღ( ´・ᴗ・` )比心,下次见~