python中的序列化和反序列化使用
程序员文章站
2022-06-16 16:58:24
...
在看django的知识时都会可能会涉及使用到restframework中序列化,所以抽时间把python中的序列化的知识总结下.
序列化和反序列化的定义
- 序列化:就是把不可传输的对象转换为可存储或可传输的过程
- 反序列化:就是把在磁盘,等介质中的数据转换为对象
python中序列化通常有两种方式:pickle模块和json模块
pickle模块的使用
对于大多数应用程序来讲,dump()和load()函数的使用就是你使用pickle
模块所需的全部了。
dumps(object)和dump(object) :序列化
loads(bytes)和load(bytes):反序列化
两者不同的是不带s的是(反)序列化关于二进制文件中,带s是(反)关于序列化对象
import pickle
dict1 = {"a": 1, "b": 2, "c": 3}
b = pickle.dumps(dict1)
print(b,type(b)) # 1
c = pickle.loads(b)
print(c,type(c)) # 2
输出结果:
1:b'\x80\x03}q\x00(X\x01\x00\x00\x00aq\x01K\x01X\x01\x00\x00\x00bq\x02K\x02X\x01\x00\x00\x00cq\x03K\x03u.' <class 'bytes'>
2:{'a': 1, 'b': 2, 'c': 3} <class 'dict'>
pickle.dump和pickle.load的使用:序列和反序列化到文件中的
import pickle
dict1 = {"a": 1, "b": 2, "c": 3}
sfile = open("dump.txt", "wb")
pickle.dump(dict1, sfile)#
sfile.close()
dfile = open("dump.txt", "rb")
result = pickle.load(dfile)
dfile.close()
print(id(dict1), result, id(result)) # 1
输出结果:
1:1433748979648 {'a': 1, 'b': 2, 'c': 3} 1433751817024
结果说明反序列化后的对象不是原来的对象了
json模块的使用
方法不带s的是file文件中使用的
json.dumps 从字典(可序列化json的对象)转换为json格式数据
json.loads 从json到字典
json.dump
json.load
default:就是把任意一个对象变成一个可序列为JSON的对象
intent:格式化好看点
import json
dict1 = {"a": 1, "b": 2, "c": 3}
a = json.dumps(dict1, indent=4)
print(a, type(a)) # 1
sa = json.loads(a)
print(sa, type(sa)) # 2
输出结果:
1:{
"a": 1,
"b": 2,
"c": 3
} <class 'str'>
2:{'a': 1, 'b': 2, 'c': 3} <class 'dict'>
现在我们想序列化一个类,如下使用相同的json.dumps(ball)序列化下面ball的对象会出现以下错误
TypeError: Object of type 'Ball' is not JSON serializable
正确的处理方法要把对象转换为可序列化json的对象,所以要使用关键字参数default和定义一个转换函数去处理
class Ball:
def __init__(self, color):
self.color = color
ball = Ball("red")
def ball2idict(bal):
return {
"color": bal.color
}
def dict2ball(odict):
return Ball(odict["color"])
objdumps = json.dumps(ball, default=ball2idict)
objloads = json.loads(objdumps, object_hook=dict2ball)
print(objdumps)# 1
print(objloads)# 2
输出结果:
1 {"color": "red"}
2 <__main__.Ball object at 0x0000025DCDDD2630>