序列化(pickling)
把變量從內存中變成可存儲或傳輸的過程
反序列化(unpickling)
把變量內容從序列化的對象從新讀到內存裏的過程網絡
序列化&反序列化的意義
在程序運行過程當中,對象可在內存中被自由的修改
一旦程序結束,對象所佔內存會被系統回收,所作修改會所有丟失,要想在內存中將對象恢復到修改後狀態,就只能從新運行程序進行修改
經過序列化和反序列化,就可把對象某一時刻在內存中的內容狀態同步到磁盤,或經過網絡傳輸到別的機器上最爲一個記錄
當想在內存中恢復該對象在那一時刻的狀態時,就可經過將磁盤或其餘機器上記錄的對象狀態反序列化至內存,而無需從新運行程序spa
實例code
序列化與反序列化(字節碼)對象
import pickle d = dict(name='Bob', age=20, score=88) bytes = pickle.dumps(d) #把對象序列化成一個bytes print(bytes)
#輸出: b'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x14X\x05\x00\x00\x00scoreq\x02KXX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00Bobq\x04u.' d1 = pickle.loads(bytes) #把bytes反序列化出對象 print(d1) #輸出:{'age': 20, 'score': 88, 'name': 'Bob'}
序列化與反序列化(二進制文件)blog
import pickle d = dict(name='Bob', age=20, score=88) f = open('dump.txt', 'wb') pickle.dump(d, f) #把對象序列化後寫入一個file-like Object f.close() f1 = open('dump.txt', 'rb') d1 = pickle.load(f) #從一個file-like Object中直接反序列化出對象 f1.close()
序列化與反序列化(自定義對象)內存
import pickle class Person: def __init__(self, name, age, job): self.name = name self.age = age self.job = job def work(self): print(self.name, 'is working...') a_person = Person('abc', 22, 'waiter') person_abc = pickle.dumps(a_person) print(person_abc) #輸出:b'\x80\x03c__main__\nPerson\nq\...' p = pickle.loads(person_abc) p.work() #輸出:abc is working... # 將類自己存儲在變量中,loads的時候返回類自己,而非它的一個實例 class_Person = pickle.dumps(Person) print(class_Person) #輸出:b'\x80\x03c__main__\nPerson\nq\x00.' Person = pickle.loads(class_Person) print(Person) #輸出:<class '__main__.Person'> p = Person('Bob', 23, 'Student') #反序列化後的Person類能夠正常建立對象 p.work() #輸出:Bob is working... with open('person.pkl', 'wb') as f: pickle.dump(Person, f) #把Person類序列化到file-like object with open('person.pkl', 'rb') as f: Person = pickle.load(f) #把Person類從file-like object反序列化到類 aa = Person('gg', 23, '6') #反序列化後的類能夠正常建立對象 aa.work() #輸出:gg is working...
注意:同步
不一樣版本的Python彼此都不兼容,只能用Pickle保存那些不重要的數據,不能成功地反序列化也不要緊
反序列化後的對象是一個新的對象it