什么是序列化?
我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思
为什么要序列化?
1:持久保存状态
需知一个软件/程序的执行就在处理一系列状态的变化,在编程语言中,'状态'会以各种各样有结构的数据类型(也可简单的理解为变量)的形式被保存在内存中。
内存是无法永久保存数据的,当程序运行了一段时间,我们断电或者重启程序,内存中关于这个程序的之前一段时间的数据(有结构)都被清空了。
在断电或重启程序之前将程序当前内存中所有的数据都保存下来(保存到文件中),以便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化。
2:跨平台数据交互
序列化之后,不仅可以把序列化后的内容写入磁盘,还可以通过网络传输到别的机器上,如果收发的双方约定好实用一种序列化的格式,那么便打破了平台/语言差异化带来的限制,实现了跨平台数据交互。
反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling
JSON序列化
import json
# 将json类型的对象与json类型的字符串相互转换
# {} 与 [] 嵌套形成的数据(python中建议数据的从{}开始)
dic = {
'a': 1,
'b': [1, 2, 3, 4, 5]
}
# 序列化: 将python的字典转化为字符串传递给其他语言或保存
json_str = json.dumps(dic)
print(json_str)
with open('1', 'w', encoding='utf-8') as w:
json.dump(dic, w) # 先将dic对象转化为字符串,再写入文件
# w.write(dic)
# 反序列化(字符str形式操作)
json_str = '''{"a": 1, "b": ['1', 2, 3, 4, 5]}'''
json_str = "{'a': 1, 'b': [1, 2, 3, 4, 5]}"
json_str = '''{"a": 1, "b": [1, 2, 3, 4, 5]}'''
new_dic = json.loads(json_str) # json类型的字符串不认''
print(new_dic, type(new_dic))
with open('1', 'r', encoding='utf-8') as r:
res = json.load(r)
print(res)
pickle序列化
import pickle
# 可以将任意类型对象与字符串进行转换
dic = {
'a': 1,
'b': [1, 2, 3, 4, 5]
}
res = pickle.dumps(dic)
print(res)
with open('2', 'wb') as w:
pickle.dump(dic, w)
# 反序列化(字节bytes形式操作)
print(pickle.loads(res))
with open('2', 'rb') as r:
print(pickle.load(r))
两者区别以及优缺点
json序列化成字符形式,pickle序列化成字节形式
json 的优点和缺点
优点 跨语言,体积小
缺点 只能支持 int str list tuple dict,不支持对象类型的序列化
pickle 的优点和缺点
优点 专门为python设计,支持python所有的数据类型,包括对象object
缺点 只能python使用,存储数据占空间大