聊一聊序列化和反序列化

栏目: Python · 发布时间: 5年前

内容简介:欢迎点击「算法与编程之美」↑关注我们!什么是序列化?什么是反序列化?为什么需要多此一举?首先来看一段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+,增加了对对象的大小、对象的种类、更多数据格式的优化等。

更多精彩文章:

算法|从阶乘计算看递归算法

算法|字符串匹配(查找)-KMP算法

JavaScript|脚本岂能随意放置

开发|优秀的 Java 工程师的“对象”一定不错

谈一谈|2019蓝桥杯回顾与分享

where2 go 团队

微信号:算法与编程之美

聊一聊序列化和反序列化

长按识别二维码关注我们!

温馨提示: 点击页面右下角 “写留言” 发表评论,期待您的参与!期待您的转发!


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Kotlin实战

Kotlin实战

【美】Dmitry Jemerov(德米特里·詹莫瑞福)、【美】 Svetlana Isakova(斯维特拉娜·伊凡诺沃) / 覃宇、罗丽、李思阳、蒋扬海 / 电子工业出版社 / 2017-8 / 89.00

《Kotlin 实战》将从语言的基本特性开始,逐渐覆盖其更多的高级特性,尤其注重讲解如何将 Koltin 集成到已有 Java 工程实践及其背后的原理。本书分为两个部分。第一部分讲解如何开始使用 Kotlin 现有的库和API,包括基本语法、扩展函数和扩展属性、数据类和伴生对象、lambda 表达式,以及数据类型系统(着重讲解了可空性和集合的概念)。第二部分教你如何使用 Kotlin 构建自己的 ......一起来看看 《Kotlin实战》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具