内容简介:欢迎点击「算法与编程之美」↑关注我们!什么是序列化?什么是反序列化?为什么需要多此一举?首先来看一段python的代码:
欢迎点击「算法与编程之美」↑关注我们!
本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。
什么是序列化?什么是反序列化?为什么需要多此一举?
什么是序列化
首先来看一段 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)) #
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+,增加了对对象的大小、对象的种类、更多数据格式的优化等。
更多精彩文章:
温馨提示: 点击页面右下角 “写留言” 发表评论,期待您的参与!期待您的转发!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Kotlin实战
【美】Dmitry Jemerov(德米特里·詹莫瑞福)、【美】 Svetlana Isakova(斯维特拉娜·伊凡诺沃) / 覃宇、罗丽、李思阳、蒋扬海 / 电子工业出版社 / 2017-8 / 89.00
《Kotlin 实战》将从语言的基本特性开始,逐渐覆盖其更多的高级特性,尤其注重讲解如何将 Koltin 集成到已有 Java 工程实践及其背后的原理。本书分为两个部分。第一部分讲解如何开始使用 Kotlin 现有的库和API,包括基本语法、扩展函数和扩展属性、数据类和伴生对象、lambda 表达式,以及数据类型系统(着重讲解了可空性和集合的概念)。第二部分教你如何使用 Kotlin 构建自己的 ......一起来看看 《Kotlin实战》 这本书的介绍吧!