序列化模块

什么叫序列化——将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化
反序列化就是把字符串变为其他数据类型
假如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?
现在我们能想到的方法就是存在文件里,然后另一个python程序再从文件里读出来。
但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中。
你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢?
没错序列化的过程就是从dic 变成str(dic)的过程。现在你可以通过str(dic),将一个名为dic的字典转换成一个字符串,
但是你要怎么把一个字符串转换成字典呢?
聪明的你肯定想到了eval(),如果我们将一个字符串类型的字典str_dic传给eval,就会得到一个返回的字典类型了。
eval()函数十分强大,但是eval是做什么的?e官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。
BUT!强大的函数有代价。安全性是其最大的缺点。
想象一下,如果我们从文件中读出的不是一个数据结构,而是一句"删除文件"类似的破坏性语句,那么后果实在不堪设设想。
而使用eval就要担这个风险。
所以,我们并不推荐用eval方法来进行反序列化操作(将str转换成python中的数据结构)

序列化的目的

1、以某种存储形式使自定义对象持久化。
2、将对象从一个地方传递到另一个地方。
3、使程序更具维护性。


json*****写程序给别人用需要用到
通用的序列化格式,相当于语言界的英语,所有语言都通用
缺点:只有很少的一部分数据类型能够通过json转换为字符串
优点:通用
json格式'{"k1":"a"}' 序列化之后,内部都是双引号,外部单引号
可以序列化的:数字,字符串,列表,字典,元祖
dumps序列化方法 此方法使用之后即可在内存当中直接调用
loads反序列化方法
    dic = {1:"a",2:'b'}
print(type(dic),dic)
import json
str_d = json.dumps(dic) # 序列化
print(type(str_d),str_d)
# '{"kkk":"v"}'
dic_d = json.loads(str_d) # 反序列化
print(type(dic_d),dic_d)


dump方法只能操作文件,意味着必须要打开一个文件进行操作,在dump里加参数ensure_ascii可以改变编码方式
load从文件里取出来的内容取决于怎么写进去的

pickle****
优点:所有pythoon中的数据类型都可以转换成字符串
缺点:pickle序列化的内容只有python能理解
且部分反序列化依赖代码

shelve***
有一个句柄
使用句柄直接操作,非常方便
新的序列化方式
原文地址:https://www.cnblogs.com/ddjl/p/8268844.html