聊一聊序列化和反序列化

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

来源: mp.weixin.qq.com

内容简介:欢迎点击「算法与编程之美」↑关注我们!什么是序列化?什么是反序列化?为什么需要多此一举?首先来看一段python的代码:

本文转载自:https://mp.weixin.qq.com/s?__biz=MzI5MTQ5NDY1MA==&mid=2247486599&idx=1&sn=79fca0432ae616a1537b09e1b15e48a8&chksm=ec0e8312db790a0481dea98a14aa0f1d07c50c6c3167ee6118420af24faae2a0e3695dc50ead&xtrack=1&scene=0&subscene=91&sessionid=1556682804&clicktime=155668,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有。

欢迎点击「算法与编程之美」↑关注我们!

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。

什么是序列化?什么是反序列化?为什么需要多此一举?

什么是序列化

首先来看一段 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 团队

微信号:算法与编程之美

聊一聊序列化和反序列化

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

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


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

关注码农网公众号

关注我们,获取更多IT资讯^_^


查看所有标签

猜你喜欢:

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

博客秘诀:超人气博客是怎样炼成的

博客秘诀:超人气博客是怎样炼成的

Darren Rowse、Chris Garrett / 向怡宁 / 人民邮电出版社 / 201005 / 39.00元

作为Web 2.0的新生事物的博客,如今已蓬勃发展,呈燎原之势,业已成为许多人的一种生活方式。中国从事博客写作的人数已达千万级,各类博客网站不可胜数。 然而,为什么有的博客人气鼎盛,拥趸众多,有的博客却门前冷落,少人问津呢?究竟应该怎样写好自己的博客,才能让它吸引更多访客的关注呢?博客网站还能为我做什么呢? 本书的两位作者长期主持知名博客站点ProBlogger.net,指导了成千上万......一起来看看 《博客秘诀:超人气博客是怎样炼成的》 这本书的介绍吧!

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

在线压缩/解压 HTML 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

html转js在线工具
html转js在线工具

html转js在线工具