前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊一聊序列化和反序列化

聊一聊序列化和反序列化

作者头像
算法与编程之美
发布2019-07-17 17:19:39
5130
发布2019-07-17 17:19:39
举报

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

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

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

什么是序列化

首先来看一段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+,增加了对对象的大小、对象的种类、更多数据格式的优化等。

更多精彩文章:

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

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

JavaScript|脚本岂能随意放置

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

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

where2go 团队


微信号:算法与编程之美

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与编程之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是序列化
  • 什么是反序列化
  • FAQ
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档