python 序列化及其相关模块(json,pickle,shelve,xml)详解

什么是序列化?

序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes

为什么要序列化和它的作用?

举个例子,你在打游戏过程中,打累了,想过两天再玩,两天之后,游戏又从你上次停止的地方继续运行,你上次游戏的进度肯定保存到硬盘上了,那么是以何种形式呢?游戏过程中产生的很多临时数据是不规律的,可能在你关掉游戏时正好是10个列表,3个嵌套字典的数据集合在内存里面,需要存下来,你如何存?把列表变成文件里的多行多列形式?那嵌套字典呢?根本没法存吧,所以,若是有种办法可以直接把内存数据存到硬盘上,下次程序再启动,再从硬盘上读出来,还是原来的格式,那是最好的,
所以这就是我们要说的序列化。

  1. 持久保存状态

一个软件/程序的执行就在处理一系列状态的变化,在编程语言中,‘状态’会以各种各样有结构的数据类型(也可以简单的理解为变量)的形式被保存在内存中
  内存是无法永久保存数据的,当程序运行了一段时间,我们断电或者重启程序,内存中关于这个程序的之前一段时间的数据(有结构)都被清空了。  在断电或重启程序之前将程序当前内存中所有的数据都保存下来(保存到文件中),以便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化。

  1. 跨平台数据交互

序列化之后,不仅可以把序列化后的内容写入磁盘,还可以通过网络传输到别的机器上,如果收发的双方约定好使用一种序列化的格式,那么变打破了平台/语言差异化带来的限制,实现了跨平台的数据交互。
  反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling.

什么是序列化对象?

我们把对象(变量)从内存中编程可存储或传输的过程称之为序列化,在python中称为pickle,其他语言称之为serialization ,marshalling ,flatterning 等等,都是一个意思。

序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上(因为硬盘或网络传输时只接受bytes)。

反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpacking。

什么可以序列化操作?

在python中,可以使用pickle和json两个模块对数据进行序列化操作其中:

  1. json可以用于字符串或者字典等与python数据类型之间的序列化与反序列化操作
  2. pickle可以用于python特有类型与python数据类型之间的序列化与反序列化操作

不懂就问:这时候有人肯定要问,两个都可以对数据进行序列化,为什么不只学习一个就好了,非要学习两个呢?

json和pickle模块

优点和缺点

关于json

优点:跨语言,体积小
缺点:只能支持int(整形),str(字符串),list(列表),tuple(元祖),dict(字典)

关于pickle
优点:专门为python设计,只支持python所有的数据类型
缺点:只能在python中使用,存储数据占空间大

举例

pickle模块提供了四个功能:dumps、dump、loads、load
python 序列化及其相关模块(json,pickle,shelve,xml)详解

Json模块也提供了四个功能:dumps、dump、loads、load,用法跟pickle一致
python 序列化及其相关模块(json,pickle,shelve,xml)详解

shelve模块

shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,返回类似于字典的对象,可读可写;key必须是字符串,二值可以持久化任何pickle可支持的python数据格式

shelve模块很简单,只有一个open函数,json和pickle模块只能dumps和loads只能一次,但是shelve就能dumps多次。这就是shelve存在的必要性,其中shelve对pickle进行了包装,是一个键值对的形式。
python 序列化及其相关模块(json,pickle,shelve,xml)详解

xml模块

xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要是xml。xml的格式如下,就是通过<>节点来区别数据结构的

举例

python 序列化及其相关模块(json,pickle,shelve,xml)详解

Json和XML的比较

一,可读性

JSON和XML的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式,很难分出胜负。

二,可扩展性

XML天生有很好的扩展性,JSON当然也有,没有什么是XML可以扩展而JSON却不能扩展的。不过JSON在Javascript主场作战,可以存储Javascript复合对象,有着xml不可比拟的优势。

三,编码难度

XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有提供的工具。无工具的情况下,相信熟练的开发人员一样能很快的写出想要的xml文档和JSON字符串,不过,xml文档要多很多结构上的字符。

除了上述之外,JSON和XML还有另外一个很大的区别在于有效数据率。JSON作为数据包格式传输的时候具有更高的效率,这是因为JSON不像XML那样需要有严格的闭合标签,这就让有效数据量与总数据包比大大提升,从而减少同等数据流量的情况下,网络的传输压力。