1. 程式人生 > >python中的序列化和反序列化使用

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