定义
序列化
将对象信息或者数据结构信息,通过一定规则进行转换,可以达到文件存储或者网络传输的效果。
反序列化
将通过序列化规则生成的字符串转化成原始的数据类型
可序列化的数据类型
- number
- str
- list
- tuple
- dict
序列化模块:json模块
是一个通用的模块,即在所有的编程语言中都有json模块,并且序列化和反序列化的规则是统一的。
json.dumps,参数解析:
- sort_keys=True:sort_keys是告诉编码器按照字典排序(a到z)输出
- indent=4:indent参数根据数据格式缩进显示,读起来更加清晰
- ensure_ascii=False:将ascii码可以转化成中文
- separators=(’,’,’:’):separators参数的作用是去掉:后面的空格,:后面的空格是为了美化输出结果的作用,但是在我们传输数据的过程中,越精简越好,冗余的东西全部去掉,因此就可以加上.
- skipkeys=True:skipkeys参数,在encoding过程中,dict对象的key只可以是string对象,如果是其他类型,那么在编码过程中就会抛出ValueError的异常。skipkeys可以跳过那些非string对象当作key的处理.
例1:使用dumps和loads,对象序列化和反序列化
import json
int1 = 123
str1 = 'aa'
list1 = [1, 2, 3]
tuple1 = (1, 'a')
dict1 = {'name': '张三'}
# 序列化
int2 = json.dumps(int1)
print(f'数字序列化后:{int2},数据类型是:{type(int2)}')
str2 = json.dumps(str1)
print(f'字符串序列化后:{str2},数据类型是:{type(str2)}')
list2 = json.dumps(list1)
print(f'列表序列化后:{list2},数据类型是:{type(list2)}')
tuple2 = json.dumps(tuple1)
print(f'数组序列化后:{tuple2},数据类型是:{type(tuple2)}')
dict2 = json.dumps(dict1)
print(f'字典序列化后:{dict2},数据类型是:{type(dict2)}')
print('--------反序列化--------')
# 反序列化
int3 = json.loads(int2)
print(f'数字反序列化后:{int3},数据类型是:{type(int3)}')
str3 = json.loads(str2)
print(f'字符串序列化后:{str3},数据类型是:{type(str3)}')
list3 = json.loads(list2)
print(f'列表序列化后:{list3},数据类型是:{type(list3)}')
tuple3 = json.loads(tuple2)
print(f'数组序列化后:{tuple3},数据类型是:{type(tuple3)}')
dict3 = json.loads(dict2)
print(f'字典序列化后:{dict3},数据类型是:{type(dict3)}')
结果:
json使用总结:
- 不论什么类型,序列化后获得都是字符串类型
- 元组类型的数据,序列化后获得的是字符串类型,但是元素是在[]中
- 元组类型序列化后再反序列化变成了列表类型,其他的数据类型则都是变成原始的类型
例2:使用dump和load,读写文件
import json
dict1 = {'name': '张三'}
# 写如文件
with open('b.json', 'w', encoding='utf-8') as f1:
json.dump(dict1, f1)
# 读取文件
with open('b.json', 'r', encoding='utf-8') as f2:
result = json.load(f2)
print(f'结果:{result},数据类型:{type(result)}')
# 将得到的数据转换成json格式,若是有中文要将ascii码转化成可以显示中文
res = json.dumps(result, ensure_ascii=False)
# json是一种数据格式,实际数据类型还是字符串
print(f'转换后结果:{res},数据类型:{type(res)}')
结果:
序列化模块:pickle模块
并不是所有的编程语言都有pickle模块
例1:使用dumps和loads,对象序列化和反序列化
import pickle
int1 = 123
str1 = 'aa'
list1 = [1, 2, 3]
tuple1 = (1, 'a')
dict1 = {'name': '张三'}
# 序列化
int2 = pickle.dumps(int1)
print(f'数字序列化后:{int2},数据类型是:{type(int2)}')
str2 = pickle.dumps(str1)
print(f'字符串序列化后:{str2},数据类型是:{type(str2)}')
list2 = pickle.dumps(list1)
print(f'列表序列化后:{list2},数据类型是:{type(list2)}')
tuple2 = pickle.dumps(tuple1)
print(f'数组序列化后:{tuple2},数据类型是:{type(tuple2)}')
dict2 = pickle.dumps(dict1)
print(f'字典序列化后:{dict2},数据类型是:{type(dict2)}')
print('--------反序列化--------')
# 反序列化
int3 = pickle.loads(int2)
print(f'数字反序列化后:{int3},数据类型是:{type(int3)}')
str3 = pickle.loads(str2)
print(f'字符串序列化后:{str3},数据类型是:{type(str3)}')
list3 = pickle.loads(list2)
print(f'列表序列化后:{list3},数据类型是:{type(list3)}')
tuple3 = pickle.loads(tuple2)
print(f'数组序列化后:{tuple3},数据类型是:{type(tuple3)}')
dict3 = pickle.loads(dict2)
print(f'字典序列化后:{dict3},数据类型是:{type(dict3)}')
结果:
pickle使用总结:
- 不论什么类型,序列化后获得都是byte类型
- 不论什么类型,序列化后再反序列化获得的都是它的原始数据类型,元组这里返回的同样是元组,这里跟json模块使用不同
例2:使用dump和load,读写文件,写入的是二进制文件,要用wb和rb模式
import pickle
dict1 = {'name': '张三'}
# 写如文件
with open('b.json', 'wb') as f1:
pickle.dump(dict1, f1)
# 读取文件
with open('b.json', 'rb') as f2:
result = pickle.load(f2)
print(f'结果:{result},数据类型:{type(result)}')
结果: