在介绍Python的数据序列化模块“Json&Pickle”之前,我们先了解一下为什么需要数据序列化,什么是数据序列化。为什么需要数据序列化,我觉得有两个原因:一个原因是把对象(一切都是对象)的状态保存在存储介质(硬盘,网盘...)中,这样就可以重新创建后来一个精确的副本就相当于镜像的概念。比如我们平时使用VMware虚拟机中的suspend功能。这个挂起函数使用数据的序列化,将虚拟机的当前状态序列化并保存在本地磁盘上的一个文件中。那么在恢复的时候,只需要反序列化,恢复状态即可。另一个原因是按值将对象从一个应用程序域发送到另一个应用程序域。比如你想将Python监控采集程序采集到的数据发送给Zabbix进行处理。当两个进程进行远程通信时,它们可以相互发送各种类型的数据。不管是什么类型的数据,都会以二进制序列的形式在网络上传输。发送方需要将这个对象转换成字节序列才能在网络上传输;接收方需要将字节序列转换回对象。序列化和反序列化:序列化:将数据结构或对象转换为二进制字符串的过程。反序列化:将序列化过程中产生的二进制字符串转换成数据结构或对象的过程。序列化的目的是跨进程传输格式化数据,并保存某一时刻的状态。什么是数据序列化:数据序列化是将对象或数据结构转换成特定的格式,以便它们可以通过网络传输或存储在内存或文件中。反序列化是相反的操作,从序列化数据中恢复对象。对象序列化后的数据格式可以是二进制、XML,也可以是JSON等任意格式。对象/数据序列化的重点在于数据的交换和传输,比如远程调用技术(如EJB、XML-RPC、WebService),或者GUI控件开发(JavaBean)等。在明确了必要性之后了解了数据格式化,简单了解了数据格式化是什么,我们就来看看Python中两个数据格式化模块的使用。JsonModuleJson:用于字符串和python数据类型之间的转换;Json模块提供了四个函数:dumps、dump、loads、load1.dumps将数据类型转换为字符串2.dump将数据类型转换为字符串并存入文件3.loads将字符串转换为数据类型4.load打开文件并将字符串转换为数据类型示例如下:#!/usr/bin/envpython3#_*_coding:utf-8_*_#Author:Lucky.chenimportjsoninfo={'1MinLoad':5,'MemUse':'5G','DiskUse':'80G'}print('转储操作前的数据类型:%s'%type(info))JsonInfo=json.dumps(info)print(JsonInfo)#dumps将数据以特殊形式转换成所有编程语言都能识别的字符串转换成python的特殊形式就是数据类型(将字符串转换成字典)NewInfo=json.loads(JsonInfo)print('loads操作后的数据类型为:%s'%type(NewInfo))print('Splittingline'.center(50,'-'))#dump将数据转为可识别的字符串所有语言以一种特殊的形式并将其写入文件withopen('SystemInfo.txt','w')asf:json.dump(info,f)print('dumpfileend!!')#load读取从文件中获取字符串并将其转换为python的数据类型withopen('SystemInfo.txt','r')asf:LoadInfo=json.load(f)print('loadfileend,datatypeis%s'%type(LoadInfo),LoadInfo)结果如下:dumps操作前的数据类型:{"MemUse":"5G","DiskUse":"80G","1MinLoad":5}dumps操作后的数据类型:loads运行后,数据类型为:---------------------分割线-----------------------dumpfileend!!loadfileend,datatypeis{'MemUse':'5G','1MinLoad':5,'DiskUse'an错误情况如下:#!/usr/bin/envpython3#_*_coding:utf-8_*_#Author:Lucky.chenimportjsondeftest():print('TestFunc')info={'Name':'crh','age':18,'Func':test}json.dumps(info)result:raiseTypeError(repr(o)+"isnotJSONserializable")typeError:isnotJSONserializable如上我们可以看到函数无法被json序列化Pickle模块pickle,用于python特有的类型Pickle模块还提供了四个python数据类型之间转换的函数:dumps、dump、loads、load1.dumps将数据类型转换成字符串2.dump将数据类型转换成字符串并存储infiles3.oads将字符串转为数据类型4.load打开文件从字符串转为数据类型Pickle可以序列化一些复杂的数据,区别fromjson是pickle在序列化的时候,存放的是二进制文件,打开文件的时候,我们要用二进制格式打开。例子如下:#!/usr/bin/envpython3#_*_coding:utf-8_*_#Author:Lucky.chenimportpickledefest(name):print('%swriteTestFunc'%name)info={'Name':'crh','age':18,'Func':test}print('转储前的数据类型是:%s'%type(info))#pickle.dumps将数据转换成一种特殊形式,只有python语言识别字节类型(Python2.*是字符串类型)NewInfo=pickle.dumps(info)print('dumpsresultis%s,datatypeis%s'%(NewInfo,type(NewInfo)))#pickle.loads传输字节在一种特殊的形式中对于python是数据类型LoadInfo=pickle.loads(NewInfo)print('loadsresultis%s,datatypeis%s'%(LoadInfo,type(LoadInfo)))LoadInfo['Func']('crh')print('Separationline'.center(50,'-'))#pickle.dump将数据以特殊形式转换为python语言只能识别的字符串,并写入到文件中withopen('pickle.rb','wb')asf:pickle.dump(info,f)#pickle.load从文件中读取一个只能被python语言识别的字符串,并转换为python数据类型withopen('pickle.rb','rb')asf:Info=pickle.load(f)print(Info,'typeis%s'%type(Info))结果如下:dumps前的数据类型为:dumpsresultisb'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x12X\x04\x00\x00\x00Nameq\x02X\x03\x00\x00\x00crhq\x03X\x04\x00\x00\x00Funcq\x04c__main__\ntest\nq\x05u.',datatypeeisloadsresultis{'age':18,'Name':'crh','Func':},datatypeiscrhwriteTestFunc--------------------------分隔线------------------------{'年龄':18,'姓名':'crh','Func':}typeis