什么是序列化?什么是反序列化?为什么需要多此一举?
什么是序列化
首先来看一段python的代码:
import pickle student = {'name':'justin', 'age': 18, 'gender': 'male'} # w: write b:binary pickle.dump(student, open('data.p', 'wb')) |
这段代码非常简单,只有三行代码,非常的简单易懂。
第一行导入了需要使用的第三方库pickle;第二行定义了一个字典变量student,保存了这个学生的姓名、年龄和性别;第三行是代码的主体部分表示的是以二进制写的方式打开文件’data.p’.
pickle.dump(...) 表示将上述定义的字典变量student以二进制写的方式写入文件data.p。
所谓序列化指的是将定义的变量的值写入文件。
什么是反序列化
还是先看一段python代码:
import pickle # r: read b:binary a = pickle.load(open('data.p', 'rb')) print(type(a)) # <class 'dict'> print(a['name']) # justin print(a['age']) # 18 print(a['gender']) # male |
open(‘data.p’, ‘rb’)表示的是以二进制读的方式打开文件data.p
pickle.load(...) 读取文件内容并进行相关处理赋值到变量a
此时可以看到变量a的类型是dict,然后直接打印字典的关键字值。
所谓反序列化指的就是读取文件内容,并自动转化为之前序列化时的对象类型。
FAQ
序列化和反序列化的基本概念已经介绍清楚,它们是一对互逆的操作。序列化将定义的变量的值写入文件,反序列化能够读取文件并还原成之前序列化前定义的变量类型,后续可以直接使用该变量。
(1)为什么需要将变量的值写入文件?
程序中定义的任何变量的值,在程序运行结束后会自动释放内存导致变量的值丢失,变量只是临时的存在。而写入文件的目的在于实现变量的值持久化,将变量的值写入文件进行持久化保存, 以便下一次程序运行的时候还能得到变量的值。
(2)为什么不用数据库来持久化数据?
序列化和数据库的方式都可以实现持久化数据,但是其使用场景有所差异。数据库顾名思义就是数据的仓库,特别适合持久化大量的数据。序列化因为其数据是保存在文件中,因此其能够保存的数据量大小受限,但是序列化的优势在于读取文件可以快速的恢复序列化之前的变量,达到开箱即用。
(3)序列化是不是将变量的每个字段的值写入文件即可,反序列化是不是简单的读取文件内容?
序列化和反序列化的过程是较为复杂的,需要定义专门的协议来实现这一过程。以pickle为例,其定义的协议为了适配不同的python版本,目前已经有五个协议版本,分别是:
Protocol version 0 is the original “human-readable” protocol and is backwards compatible with earlier versions of Python. Protocol version 1 is an old binary format which is also compatible with earlier versions of Python. Protocol version 2 was introduced in Python 2.3. It provides much more efficient pickling of new-style classes. Refer to PEP 307 for information about improvements brought by protocol 2. Protocol version 3 was added in Python 3.0. It has explicit support for bytes objects and cannot be unpickled by Python 2.x. This is the default protocol, and the recommended protocol when compatibility with other Python 3 versions is required. Protocol version 4 was added in Python 3.4. It adds support for very large objects, pickling more kinds of objects, and some data format optimizations. Refer to PEP 3154 for information about improvements brought by protocol 4. |
可以看到目前最新的协议版本是4,能够支持python3.4+,增加了对对象的大小、对象的种类、更多数据格式的优化等。