一、何为序列化及对应反序列
1、序列化:内存中的数据类型===》序列化===》特定格式(json格式或pickle格式)
2、反序列:内存中的数据类型《===反序列《===特定格式(json格式或pickle格式)
二、序列化的意义
1、存档:储存数据,多用专用的pickle格式,该格式只有python可以识别。
2、跨平台交互:把数据传输给其他平台使用,只能用通用的json格式,该格式所有语言都可以识别。例如,把python的列表类型,经过序列化传输给其他平台,其他平台得到后再反序出数组类型。
三、具体使用:以json格式为例,pickle与之同理
1、序列化与反序列
import json l = [1, 2.2, 'a', True, None, ['bb', ], {'ccc': 'ddd'}, ('eeee',)] l = json.dumps(l) # 序列化 print(l) # 结果为一个整体的字符串 "[1, "a", true, null, ["bb"], {"ccc": "ddd"}, ["eeee"]]" # 1、整型 ===> 整型 # 2、浮点型 ===> 浮点型 # 3、字符串的单引号 ===> 双引号 # 4、布尔型的首字符大写 ===> 首字母小写 # 5、None ===> null # 6、[] ===> [] # 7、{} ===> {} # 8、() ===> [] l = json.loads(l) # 反序列 print(l) # 结果为原来的列表 [1, 2.2, 'a', True, None, ['bb'], {'ccc': 'ddd'}, ['eeee']]
2、对于文件读写的精简格式
import json l = [1, 2.2, 'a', True, None, ['bb', ], {'ccc': 'ddd'}, ('eeee',)] with open(r'aaa.txt', mode='wt', encoding='utf-8')as f: json.dump(l, f) # 把列表 l 序列化写入句柄 f 打开的文件 with open(r'aaa.txt', mode='rt', encoding='utf-8')as f: print(json.load(f)) # 把句柄 f 打开的文件中的内容反序列读出,结果为原来的列表
3、对于bytes类型:可以直接对bytes类型进行
import json a = '你好' a = json.dumps(a) print(a) # 序列化非asc码表的字符会自动转为bytes类型,结果为 "\u4f60\u597d" a = json.loads(a) print(a) # 反序列bytes类型后会自动解码,结果为 '你好'
4、格式兼容:json兼容的是所有语言的通用类型,所以不能识别某一语言的特有类型,比如python的集合,就无法被json识别,此时要用python专用的pickle格式。
import json import pickle a = {1, 2, 3} # 对于集合类型 a = json.dumps(a) # 报错,不是一个可以用 json 格式序列化的类型 a = pickle.dumps(a) print(a) # 结果是bytes类型,b'\x80\x04\x95\x0b\x00\x00\x00\x00\x00\x00\x00\x8f\x94(K\x01K\x02K\x03\x90.'