国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

詳解Python中的序列化與反序列化的使用

2020-02-23 01:40:13
字體:
來源:轉載
供稿:網友

學習過marshal模塊用于序列化和反序列化,但marshal的功能比較薄弱,只支持部分內置數據類型的序列化/反序列化,對于用戶自定義的類型就無能為力,同時marshal不支持自引用(遞歸引用)的對象的序列化。所以直接使用marshal來序列化/反序列化可能不是很方便。還好,python標準庫提供了功能更加強大且更加安全的pickle和cPickle模塊。

cPickle模塊是使用C語言實現的,所以在運行效率上比pickle要高。但是cPickle模塊中定義的類型不能被繼承(其實大多數時候,我們不需要從這些類型中繼承。)。cPickle和pickle的序列化/反序列化規則是一樣的,我們可以使用pickle序列化一個對象,然后使用cPickle來反序列化。同時,這兩個模塊在處理自引用類型時會變得更加“聰明”,它不會無限制的遞歸序列化自引用對象,對于同一對象的多次引用,它只會序列化一次。例如:
 

import marshal, pickle list = [1]list.append(list)byt1 = marshal.dumps(list) #出錯, 無限制的遞歸序列化byt2 = pickle.dumps(list) #No problem
pickle的序列化規則

Python規范(Python-specific)提供了pickle的序列化規則。這就不必擔心不同版本的Python之間序列化兼容性問題。默認情況下,pickle的序列化是基于文本的,我們可以直接用文本編輯器查看序列化的文本。我們也可以序列成二進制格式的數據,這樣的結果體積會更小。更詳細的內容,可以參考Python手冊pickle模塊。

下面就開始使用pickle吧~
pickle.dump(obj, file[, protocol])

序列化對象,并將結果數據流寫入到文件對象中。參數protocol是序列化模式,默認值為0,表示以文本的形式序列化。protocol的值還可以是1或2,表示以二進制的形式序列化。
pickle.load(file)

反序列化對象。將文件中的數據解析為一個Python對象。下面通過一個簡單的例子來演示上面兩個方法的使用:
 

#coding=gbk import pickle, StringIO class Person(object): '''自定義類型。 ''' def __init__(self, name, address):  self.name = name  self.address = address    def display(self):  print 'name:', self.name, 'address:', self.address  jj = Person("JGood", "中國 杭州")jj.display()file = StringIO.StringIO() pickle.dump(jj, file, 0) #序列化#print file.getvalue() #打印序列化后的結果  #del Person #反序列的時候,必須能找到對應類的定義。否則反序列化操作失敗。file.seek(0)jj1 = pickle.load(file) #反序列化jj1.display()file.close()

注意:在反序列化的時候,必須能找到對應類的定義,否則反序列化將失敗。在上面的例子中,如果取消#del Person的注釋,在運行時將拋AttributeError異常,提示當前模塊找不到Person的定義。
pickle.dumps(obj[, protocol])

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 调兵山市| 大邑县| 合肥市| 昌乐县| 东丰县| 扶余县| 昭通市| 遂川县| 奉贤区| 克拉玛依市| 咸阳市| 白山市| 如皋市| 宣恩县| 呈贡县| 堆龙德庆县| 临湘市| 绥德县| 腾冲县| 彭州市| 大新县| 湖北省| 屏边| 惠水县| 永州市| 阿克| 同江市| 天柱县| 浑源县| 光山县| 谢通门县| 泉州市| 孟村| 拉孜县| 黄大仙区| 舞阳县| 临泉县| 沙河市| 临沂市| 上高县| 禹州市|