一 概述
1 为什么要序列化
因为TCP/IP协议只支持字节数组的传输,不能直接传对象。对象序列化的结果一定是字节数组!当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。
2 序列化和反序列化
序列化(serialization):及有序的列,数据转换成二进制的有序的过程
协议:规定序列化和反序列化的转换方式及就是把数据保存成二进制存储起来,其是定义的规则,其规则称为协议如果规定了协议,则可以进行序列化和反序列化,其协议是由版本的,约定协议后进行处理
反序列化(deserialization):将有序的二进制序列转换成某种对象(字典,列表等)称为反序列化
持久化:序列化保存到文件就是持久化,序列化未必会持久化,序列化往往是传输或存储。可以将数据序列化后持久化,或者网络传输,也可以将从文件或网络接受到的字节序列反序列化。
二 python pickle
1 概述
pickle python中的序列化,反序列化模块,其局限是仅限于传输的两端都是python的情况,且尽量保持两端的版本一致
2 pickle 库基本方法
dumps 对象序列化,在内存中
dump 对象序列化到文件对象,就是存入文件
loads 对象反序列化
load 对象反序列化,从文件中读取数据
3 实例
#!/usr/local/bin/python3.6
#coding:utf-8
from pickle import *
from pathlib import Path
lst='a b c d'.split() #返回一个列表
d=dict(zip('abcd',range(4))) #构建一个字典
print (lst,d) # 打印字典和列表
p=Path('/root/test.py')
if not p.parent.exists(): # 创建文件的上级目录
p.parent.mkdir(parents=True)
with open(p,'wb+') as f: #进行序列化,必须是二进制的输入,否则会报错
dump(lst,f)
dump(d,f)
with open(p,'rb') as f: #此处对应的是二进制的输出
print (load(f))
print (load(f))
结果如下
#!/usr/local/bin/python3.6
#coding:utf-8
from pickle import *
fro