欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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>