新聞中心
python的序列化是把變量從內(nèi)存中變成可存儲(chǔ)或傳輸?shù)倪^程,反序列化是把變量?jī)?nèi)容從序列化的對(duì)象重新讀到內(nèi)存的過程。方法是:1、導(dǎo)入pickle模塊;2、利用pickle中的loads或load函數(shù)進(jìn)行反序列化操作。
我們把變量從內(nèi)存中變成可存儲(chǔ)或傳輸?shù)倪^程稱之為序列化。
序列化之后,就可以把序列化后的內(nèi)容寫入磁盤,或者通過網(wǎng)絡(luò)傳輸?shù)絼e的機(jī)器上。
反過來(lái),把變量?jī)?nèi)容從序列化的對(duì)象重新讀到內(nèi)存里稱之為反序列化,即unpickling。
舉例:大家應(yīng)該都玩過魔獸爭(zhēng)霸,應(yīng)該知道該游戲有一個(gè)存檔的功能,我每次不想玩得時(shí)候就可以存檔,然后再玩得時(shí)候我們根本不需要重新開始玩,只需要讀檔就可以了。我們現(xiàn)在學(xué)習(xí)的事面向?qū)ο蟮乃枷?,那么在我們眼中不管是我們的游戲角色還是游戲中的怪物、裝備等等都可以看成是 一個(gè)個(gè)的對(duì)象,進(jìn)行簡(jiǎn)單的分析。
角色對(duì)象(包含等級(jí)、性別、經(jīng)驗(yàn)值、HP、MP等等屬性)
武器對(duì)象(包含武器的類型、武器的傷害、武器附加的能力值等等屬性)
怪物對(duì)象(包含等級(jí)、經(jīng)驗(yàn)值、攻擊、怪物類型等等)
于是玩游戲過程變的非常有意思了,創(chuàng)建游戲角色就好像是創(chuàng)建了一個(gè)角色對(duì)象,拿到武器就好像創(chuàng)建了一個(gè)武器對(duì)象,遇到的怪物、NPC等等都是對(duì)象了。
然后再用學(xué) 過的知識(shí)進(jìn)行分析,我們發(fā)現(xiàn)對(duì)象的數(shù)據(jù)都是保存在內(nèi)存中的,應(yīng)該都知道內(nèi)存的數(shù)據(jù)在斷電以后是會(huì)消失的,但是我們的游戲經(jīng)過存檔以后,就算你關(guān)機(jī)了幾天, 再進(jìn)入游戲的時(shí)候,讀取你的存檔發(fā)現(xiàn)你在游戲中的一切都還在呢,奇怪了,明明內(nèi)存中的數(shù)據(jù)已經(jīng)沒有了啊,這是為什么呢?于是再仔細(xì)考慮,電腦中有硬盤這個(gè) 東西在斷電以后保存的數(shù)據(jù)是不會(huì)丟的(要是由于斷電導(dǎo)致的硬盤損壞了,沒有數(shù)據(jù)了,哈哈,不在此考慮中)。那么應(yīng)該很容易的想到這些數(shù)據(jù)是被保存在硬盤中 了。沒錯(cuò)!這就是對(duì)象的持久化,也就是我們今天要講的對(duì)象的序列化。那么反序列化就很好理解了就是將存放在硬盤中的信息再讀取出來(lái)形成對(duì)象。
pickle模塊提供了四個(gè)功能:dumps、dump、loads、load。
dumps和dump都是進(jìn)行序列化,而loads和load則是反序列化。
>>> import pickle >>> d=[1,2,3,4] >>> pickle.dumps(d) b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04e.'
dumps將所傳入的變量的值序列化為一個(gè)bytes,然后,就可以將這個(gè)bytes寫入磁盤或者進(jìn)行傳輸。
而dump則更加一步到位,在dump中可以傳入兩個(gè)參數(shù),一個(gè)為需要序列化的變量,另一個(gè)為需要寫入的文件。
f=open('file_test','wb')
>>> d=[1,2,3,4]
>>> pickle.dump(d,f)
>>> f.close()
>>> f=opem('file_test','rb')
f=open('file_test','rb')
>>> f.read()
b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04e.'loads當(dāng)我們要把對(duì)象從磁盤讀到內(nèi)存時(shí),可以先把內(nèi)容讀到一個(gè)bytes,然后用loads方法反序列化出對(duì)象,也可以直接用load方法直接反序列化一個(gè)文件。
>>> d=[1,2,3,4] >>> r=pickle.dumps(d) >>> print(r) b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04e.' >>> pickle.loads(r) [1, 2, 3, 4]
>>> d=[1,2,3,4]
>>> f=open('file_test','wb')
>>> pickle.dump(d,f)
>>> f.close()
>>> f=open('file_test','rb')
>>> r=pickle.load(f)
>>> f.close()
>>> print(r)
[1, 2, 3, 4]
推薦課程:Matplotlib圖形繪制(Corey Schafer)
網(wǎng)站題目:創(chuàng)新互聯(lián)Python教程:python什么是反序列化?
本文鏈接:http://fisionsoft.com.cn/article/codices.html


咨詢
建站咨詢

