python中的序列化和反序列化使用
阿新 • • 發佈:2019-02-18
在看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>