python中的序列化和反序列化使用

在看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.' 
2:{'a': 1, 'b': 2, 'c': 3} 

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>

你可能感兴趣的:(python之路)