Skip to main content

序列化和反序列化

序列化: 就是把一个在内存当中的python对象通过某种协议或者标准,转换成二进制类型的数据 。

反序列化: 是一个完全相反的过程,从磁盘文件或者网络中读取到二进制数据,将它们转换成内存中可操作的对象。

常用的序列化方案:pickle,xml,json,messagepack

序列化和反序列化方法:

在python中,虽然有多种序列化方案,但是统一了调用方法名称,便于我们记忆。

  • 序列化:使用dumps或者dump方法 dumps:将 内存对象 序列化为 字节对象 dump:将 内存对象 序列化到 文件对象(就是存入文件)

  • 反序列化:使用loads和load方法

    loads:将 字节对象 反序列化为 内存对象 load:从 文件对象 反序列化 内存对象

dumps和loads是一对,它们的数据是不落地的,也就是在内存当中,dump和load是一对,它们的数据是要落地到磁盘文件当中的。

序列化的应用场景

一般来说,本地序列化应用的比较少,大多数场景还是应用在网络传输中,因为网络传输也必须首先是二进制数据,所以先在本地将需要传输的数据进行序列化后,然后通过网络传输给远程节点,远程节点拿到序列化数据后,就进行反序列化成自己的数据对象。

pickle模块

pickle是python提供的一种序列化方案,它能 跨平台,但是不能跨语言 ,也就是说,用python的pickle序列化的数据,只有python能认识和反序列化。

pickle.dumps(obj) -> 字节数据 pickle.loads(字节数据) -> obj

import pickle
d = {'a':1,'b':'我爱你','c':[1,2]}
l = [1,2,['a','b']]
t = ('let','///')
#序列化一个字典
dp = pickle.dumps(d)
print(dp) #打印出来的是二进制数据
b"\x80\x04\x95'\x00\x00\x00\x00\x00\x00\....
#序列化一个列表
lp = pickle.dumps(l)
#序列化一个元组
tp = pickle.dumps(t)

#反序列化为一个字典
dp2 = pickle.loads(dp)
print(dp2)
{'a': 1, 'b': '我爱你', 'c': [1, 2]}
#反序列化为一个列表
pickle.loads(lp)
#反序列化为一个元组
pickle.loads(tp)

pickle.dump(obj,file_obj) -> 字节数据 pickle.load(file_obj) -> obj

说明:在使用dump和load进行序列化和反序列化时,指定的那个 文件对象需要以‘b’模式打开

#将d这个字典对象,通过pickle序列化,然后将序列化后的数据落地到磁盘文件中
with open(r'C:\dump.file','wb') as f:
pickle.dump(d,f)

#从磁盘文件中中读取二进制数据,通过pickle进行反序列化成字典对象
with open(r'C:\dump.file','rb') as f:
a = pickle.load(f)
print(a)
{'a': 1, 'b': '我爱你', 'c': [1, 2]}

JSON模块

json:JavaScript object notation,JS对象标记,它是一种非常通用的、轻量级的数据序列化标准格式,它不仅可以 跨平台,还可以跨语言 ,比如python序列化的json格式的数据传给java,java拿到进行反序列化照样可用,是完全独立于编程语言的的文本格式,可以被所有语言读取,也可以非常方便的存储磁盘或者通过网络传输。json 本质上也是一个文本,一个字符串

json的数据类型

json和python一样,有多种数据类型和两种数据结构,而且它们也很相似,可以类比理解。

常用的数据类型:字符串(string)、数值(number)、true、false、 null 两种数据结构:对象(object)或者数组(array)

string: json的字符串是由双引号包围起来的任意字符,可以有转义字符

number:正负整数,浮点数

object:对象,就是Python的字典,格式: {k1:v1,k2:v2}key必须是一个双引号引起的字符串 ,value可以是任意合法值

array:数组,就是Python的列表,格式: [v1,v2,v3] ,值之间用‘,’号分割

true,flase:就是Python的True,False

null:就是Python的None

常用的json数据格式

对象:{"name":"Michael","age":24}

数组:[{"name":"Michael","age":24},{"name":"Tom","age":25}]

序列化和反序列化

json.dumps(obj) -> json格式数据 json.loads(json格式数据) -> obj

json.dump(obj,file_obj) ->序列化成json数据,并写入文件 json.load(file_obj) ->从文件读取json数据,并反序列化为对象

import json

json_data = [{"name":"Michael","age":24},{'name':"Tom","age":25},(123,23),None,True]

#将Python的数据对象转换成json格式
a = json.dumps(json_data)
print(a)
#注意类型的转换
'[{"age": 24, "name": "Michael"}, {"age": 25, "name": "Tom"}, [123, 23], null, true]'

#将json格式的数据转换成Python的数据对象
a1 = json.loads(a)
print(a1)
[{'name': 'Michael', 'age': 24}, {'name': 'Tom', 'age': 25}, [123, 23], None, True]