定义

序列化

将对象信息或者数据结构信息,通过一定规则进行转换,可以达到文件存储或者网络传输的效果。

反序列化

将通过序列化规则生成的字符串转化成原始的数据类型

可序列化的数据类型

  • number
  • str
  • list
  • tuple
  • dict

序列化模块:json模块

是一个通用的模块,即在所有的编程语言中都有json模块,并且序列化和反序列化的规则是统一的。

python实现自定义对象的 序列化反序列化方法 序列化和反序列化 python_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)}')

结果:

python实现自定义对象的 序列化反序列化方法 序列化和反序列化 python_json_02

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)}')

结果:

python实现自定义对象的 序列化反序列化方法 序列化和反序列化 python_数据类型_03

序列化模块:pickle模块

并不是所有的编程语言都有pickle模块

python实现自定义对象的 序列化反序列化方法 序列化和反序列化 python_序列化_04

例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)}')

结果:

python实现自定义对象的 序列化反序列化方法 序列化和反序列化 python_json_05

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)}')

结果:

python实现自定义对象的 序列化反序列化方法 序列化和反序列化 python_json_06