python基礎之模組之序列化

2021-07-31 07:23:29 字數 3011 閱讀 5628

---什麼是序列化(picking)?

我們把變數從記憶體中變成可儲存或傳輸的過程稱之為序列化。

序列化之後,就可以把序列化後的內容寫入磁碟,或者通過網路傳輸到別的機器上。

反過來,把變數內容從序列化的物件重新讀到記憶體裡稱之為反序列化,即unpickling。

舉例:大家應該都玩過魔獸爭霸,應該知道該遊戲有乙個存檔的功能,我每次不想玩得時候就可以存檔,然後再玩得時候我們根本不需要重新開始玩,只需要讀檔就可以了。我們現在學習的事物件導向的思想,那麼在我們眼中不管是我們的遊戲角色還是遊戲中的怪物、裝備等等都可以看成是 乙個個的物件,進行簡單的分析。

角色物件(包含等級、性別、經驗值、hp、mp等等屬性)

**物件(包含**的型別、**的傷害、**附加的能力值等等屬性) 

怪物物件(包含等級、經驗值、攻擊、怪物型別等等) 

於是玩遊戲過程變的非常有意思了,建立遊戲角色就好像是建立了乙個角色物件,拿到**就好像建立了乙個**物件,遇到的怪物、npc等等都是物件了。

然後再用學 過的知識進行分析,我們發現物件的資料都是儲存在記憶體中的,應該都知道記憶體的資料在斷電以後是會消失的,但是我們的遊戲經過存檔以後,就算你關機了幾天, 再進入遊戲的時候,讀取你的存檔發現你在遊戲中的一切都還在呢,奇怪了,明明記憶體中的資料已經沒有了啊,這是為什麼呢?於是再仔細考慮,電腦中有硬碟這個 東西在斷電以後儲存的資料是不會丟的(要是由於斷電導致的硬碟損壞了,沒有資料了,哈哈,不在此考慮中)。那麼應該很容易的想到這些資料是被儲存在硬碟中 了。沒錯!這就是物件的持久化,也就是我們今天要講的物件的序列化。那麼反序列化就很好理解了就是將存放在硬碟中的資訊再讀取出來形成物件。

---如何序列化?

在python中提供了兩個模組可進行序列化。分別是pickle和json。

pickle

pickle是python中獨有的序列化模組,所謂獨有,就是指不能和其他程式語言的序列化進行互動,因為pickle將資料物件轉化為bytes

>>> import

pickle

>>> d=[1,2,3,4]

>>>pickle.dumps(d)b'

\x80\x03]q\x00(k\x01k\x02k\x03k\x04e.

'>>>type(pickle.dumps(d))

'bytes

'> #型別為bytes

pickle模組提供了四個功能:dumps、dump、loads、load。

dumps和dump都是進行序列化,而loads和load則是反序列化。

dumps將所傳入的變數的值序列化為乙個bytes,然後,就可以將這個bytes寫入磁碟或者進行傳輸。

而dump則更加一步到位,在dump中可以傳入兩個引數,乙個為需要序列化的變數,另乙個為需要寫入的檔案。

loads當我們要把物件從磁碟讀到記憶體時,可以先把內容讀到乙個bytes,然後用loads方法反序列化出物件,也可以直接用load方法直接反序列化乙個檔案。

json

如果我們要在不同的程式語言之間傳遞物件,就必須把物件序列化為標準格式,比如xml,但更好的方法是序列化為json,因為json表示出來就是乙個字串,可以被所有語言讀取,也可以方便地儲存到磁碟或者通過網路傳輸。json不僅是標準格式,並且比xml更快,而且可以直接在web頁面中讀取,非常方便。

如果想要詳細了解json的話,推薦一篇博文:

json中的方法和pickle中差不多,也是dumps,dump,loads,load。使用上也沒有什麼區別,區別在於,json中的序列化後格式為字元。

>>> import

json

>>> d=[1,2,3,4]

>>>json.dumps(d)

'[1, 2, 3, 4]

'>>>type(json.dumps(d))

'str

'> #型別為str

因為python中一切事物皆物件,所有物件都是基於類建立的,所以,『類』在python中佔據了相當大的比重。我們能否將類的例項進行序列化呢?

>>> class

student(object):

...

def__init__

(self,name,age,course):

... self.name=name

... self.age=age

... self.course=course

...

>>> a=student('

linghuchong

',24,'

xixing****')

>>> import

json

>>>json.dumps(a)

typeerror:

is not json serializable

暈,竟然不能!現在幾乎都是物件導向程式設計,類這麼重要,竟然不能序列化,怎麼搞?

不要著急,前面的**之所以無法把student類例項序列化為json,是因為預設情況下,dumps方法不知道如何將student例項變為乙個json的'{}'物件。

我們需要』告訴『json模組如何轉換。

>>> def

st_to_dict(a):

...

return

...

>>> print(json.dumps(a,default=st_to_dict)) #default引數就是告知json如何進行序列化

當然,如果我們每定義乙個類,還得再定義一下這個類的例項轉換為字典的函式實在是太麻煩了!!我們有乙個一勞永逸的辦法。

print(json.dumps(a, default=lambda obj: obj.__dict__))
其中的__dict__不需我們在類中定義,因為通常class的例項都有乙個__dict__屬性,它就是乙個字典,用來儲存例項變數。

>>> print(a.__dict__

)

python基礎之模組之序列化

什麼是序列化 picking 我們把變數從記憶體中變成可儲存或傳輸的過程稱之為序列化。序列化之後,就可以把序列化後的內容寫入磁碟,或者通過網路傳輸到別的機器上。反過來,把變數內容從序列化的物件重新讀到記憶體裡稱之為反序列化,即unpickling。舉例 大家應該都玩過魔獸爭霸,應該知道該遊戲有乙個存...

python模組之序列化模組

序列化 序列 字串 序列化 其他資料型別轉化為字串資料型別 反序列化 字串轉化為其他資料型別 json模組 json 五星好評 數字 字串 列表 字典 元組 優點 通用的序列化格式 缺點 只有很少的一部分資料型別 字串 1,dumps和loads import json dumps和loads 操作...

python基礎 序列化模組

abdsafaslhiewhldvjlmvlvk 序列化 轉向乙個字串資料型別 序列 字串 資料儲存 網路上傳輸的時候 從資料型別 字串的過程 序列化 從字串 資料型別的過程 反序列化 json pickle shelve json 數字 字串 列表 字典 元組 通用的序列化格式 只有很少的一部分資...