一、何为序列化及对应反序列

  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.'

 

posted on 2020-02-01 07:01  焚音留香  阅读(119)  评论(0编辑  收藏  举报