一、什么是序列化和反序列化?
- 我们把对象(或变量)从内存变成可存储或可传输的过程称之为序列化,在python中被称为picking;
- 自定义的类的实例如何保存在一个文件中?如何从文件中读取数据,并让他们在内存中再次恢复成自己对应的类的实例?
- 按照某种规则,把内存中的数据保存到文件中,文件是一个字节序列,所以必须要把内存数据转换成为字节序列,输出到文件,这就是序列化;反之,从文件的字节回复到内存,就是反序列化;
二、为什么要序列化?
- 持久化保持状态
- 跨平台的数据交互
三、pickle模块
pickle模块是python专用的持久化模块,可以持久化包括自定义类在内的各种数据;只能在python程序之间进行数据交换;
方法:
dumps | 将对象序列化成bytes对象 |
dump | 对象序列化到文件对象,就是存入文件; |
loads | 从bytes对象反序列化; |
load | 对象反序列化,从文件读取数据; |
注意:在使用dump()序列化时候,打开文件必须要以wb模式,使用load()反序列化,打开文件必须以rb模式;
import pickle
class A:
def __init__(self, name, age):
self.name = name
self.age = age
def show(self):
print("my name is {}, my age is {}".format(self.name, self.age))
a = A('tom', 18)
pickle.dump(a, open('ser', 'wb'))
a = pickle.load(open('ser', 'rb'))
a.show()
# 序列化和反序列化必须保证使用同一套类的定义,否则会带来不可预料的结果
四、Json与json模块
1、JSON
- JSON:JavaScript Object Notation,JS对象标记,是一种轻量级的数据交换格式;
- JSON是跨平台语言,所以只能对python的基本数据类型进行操作,无法识别python的类;
2、python的json模块
数据转换:
使用方法:
记忆方法:
- 序列化,数据到文件,就dump;
- 反序列化,文件到数据,就load;
- 根据字符串转换就加s;
- 从文件直接转就不加s;
写入与读取的实例:
一般来说json编码的数据很少落地,数据都是通过网络传输;传输的时候,就要考虑压缩它;本质来说它就是个文本,就是字符串;
import json
acc_dic={
'id':1234,
'password':'abc',
'credit':15000,
'balance':15000,
'enroll_data':'2018-11-19',
'expire_data':'2021-11-19',
'pay_day':22,
'status':0 # 0=normal,1=locked,2=disabled
}
# 写入到文件
with open('accounts/1234.json','w') as f:
json.dump(acc_dic,f)
# 读取json文件
with open('accounts/1234.json','r') as f:
data=json.load(f)
print(data,type(data))