您好,登錄后才能下訂單哦!
這篇文章主要介紹Python中序列化和反序列化是什么,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
什么是序列化,反序列化?
序列化:把對象轉(zhuǎn)換為字節(jié)序列的過程稱為對象的序列化。
反序列化:把字節(jié)序列恢復(fù)為對象的過程稱為對象的反序列化。
自我理解:
在代碼運行時,我們看到很多的對象,可以是一個,也可以是一類對象的集合,很多的對象數(shù)據(jù),這些數(shù)據(jù)中,有些信息我們想讓它持久的保存起來,那么這個就需要做:
數(shù)據(jù)寫入 》》》**序列化**——就是把內(nèi)存里面的這些對象給變成一連串的字節(jié)描述的過程。
常見的就是把項目中的數(shù)據(jù)寫入,變成文件保存本地。
同樣的,如果要把保存的文件讀取出來,成為數(shù)據(jù)顯示在我們的項目中,或者己用。
那么就需要做:
文件讀取》》》**反序列化**——就是把文件中一連串的字節(jié)轉(zhuǎn)為一個對象放入內(nèi)存里存放的過程。
虛擬機是否允許反序列化,不僅取決于類路徑和功能代碼是否一致,一個非常重要的一點是兩個類的序列化 ID 是否一致(比如java常見的 private static final long serialVersionUID = 1L)。
清單 1 中,雖然兩個類的功能代碼完全一致,但是如果序列化 ID值 不同,他們無法相互序列化和反序列化。
簡單來說,Java的序列化機制是通過在運行時判斷類的serialVersionUID來驗證版本一致性的。
什么情況下需要序列化?
當(dāng)你想把的內(nèi)存中的對象狀態(tài)保存到一個文件中或者數(shù)據(jù)庫中時候;
當(dāng)你想用套接字在網(wǎng)絡(luò)上傳送對象的時候;
當(dāng)你想通過RMI傳輸對象的時候;
(最常用的可能就存數(shù)據(jù)庫的)
實現(xiàn)序列化
1.java中
在java中序列化和反序列化實現(xiàn):Java Serializable 序列化接口。
public class xxx implements Serializable { private static final long serialVersionUID = 1L }
2.python中
在Python中,Pickle模塊就用來實現(xiàn)數(shù)據(jù)序列化和反序列化。
(1)只能在python中使用,只支持python的基本數(shù)據(jù)類型。
(2)可以處理復(fù)雜的序列化語法。(例如自定義的類的方法,游戲的存檔等)
(3)序列化的時候,只是序列化了整個序列對象,而不是內(nèi)存地址。
需要引入:
import pickle
一、dump()方法
pickle.dump(obj, file, [,protocol])
寫入文件并序列化:
import pickle test = r'test.txt' #反序列化代碼中也要定義相同的函數(shù)名稱,函數(shù)體沒限制 def sayhi(name): print("hello",name) info = { '':'', 'age':32, 'func':sayhi } print(pickle.dumps(info)) with open(test,'wb') as f: #f.write( pickle.dumps(info) ) pickle.dump(info,f) #跟上面的f.write( pickle.dumps(info) )語意完全一樣。
注釋:序列化對象,將對象obj保存到文件file中去。參數(shù)protocol是序列化模式,默認是0(ASCII協(xié)議,表示以文本的形式進行序列化),protocol的值還可以是1和2(1和2表示以二進制的形式進行序列化。其中,1是老式的二進制協(xié)議;2是新二進制協(xié)議)。file表示保存到的類文件對象,file必須有write()接口,file可以是一個以’w’打開的文件或者是一個StringIO對象,也可以是任何可以實現(xiàn)write()接口的對象。
二、load()方法
pickle.load(file)
從文件中讀取,并返序列化:
import pickle test = r'test.txt' #需要定義序列化代碼中同樣的函數(shù)名,函數(shù)體沒限制 def sayhi(name): print("hello",name) print("hello2",name) with open(test,'rb') as f: # data = pickle.loads(f.read()) data = pickle.load(f) #跟上面的data = pickle.loads(f.read())語意完全一樣。 print('data>>>',data) print(data['func']("Alex"))
注釋:反序列化對象,將文件中的數(shù)據(jù)解析為一個python對象。file中有read()接口和readline()接口
一般來說在python中,兩個方法是連用的。
以上是Python中序列化和反序列化是什么的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。