91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

21文件IO_pickle

發布時間:2020-06-24 00:44:48 來源:網絡 閱讀:293 作者:chaijowin 欄目:編程語言

?

序列化、反序列化:

為什么要序列化?

內存中的字典、鏈表如何保存到一個文件中?

如果是自己定義的類的實例,如何保存到一個文件中?

如何從文件中讀取數據,并讓它們在內存中再次變成自己對應的類的實例?

?

要設計一套協議(協議有版本,不同版本有不同的實現,規則不一樣),按照某種規則,把內存中數據保存到文件中,文件是一個字節序列,所以必須把數據轉換成字節序列,輸出到文件,這就是序列化;反之,從文件的字節序列恢復到內存,就是反序列化;

?

數據轉換成二進制的有序序列的過程,稱為序列化;

從文件(有序的二進制序列)轉換成某種對象(listdict等)的過程,稱為反序列化;

?

serialization序列化,將內存中對象存儲下來,把它變成一個個字節(二進制);

deserialization反序列化,將文件的一個個字節(二進制)恢復成內存中的對象;

?

注:

持久化,存在磁盤中,掉電不丟失;

序列化保存到文件,就是持久化;

可以將數據序列化后持久化(持久化前一定要序列化),或者網絡傳輸(通常big-edian模式),也可以從文件中或網絡接收到的字節序列反序列化;

每一種高級語言都有自己的序列化;

異構平臺,兩端,如c/c++<-->python,要約定協議規定等;

?

?

?

python提供了pickle庫:

pickle僅限網絡兩端都是python程序;

import pickle

pickle.dumps(obj,protocol,fix_imports),對象序列化,不落地,在內存中操作;

pickle.dump(obj,protocol,fix_imports),對象序列化到文件對象,存入文件;

pickle.loads(data,fix_imports,encoding,errors),對象反序列化,從內存加載;

pickle.load(file,fix_imports,encoding,errors),對象反序列化,從文件讀取數據;

?

內建類型listdict等,兩邊定義一致;

類、類屬性、類方法,僅序列化類名,兩端若類定義不一致,在調用后會有問題

對象屬性相關的,會序列化;而類方法、類屬性不會序列化(僅序列化類名)

?

總結:

反序列化時,類是棋子,二進制序列就是鐵水;

類似,中央發往各州縣的錢模;適合分布式;

?

rpc,遠程過程調用原型;在網絡編程中極為重要,底層要實現的就是序列化、反序列化;

dictlist為內建的類;

通常需要自定義類,兩邊的自定義要一致;

自定義的序列化要作校驗

?

應用:

本地序列化的情況,應用較少;

一般來說,大多數場景都應用在網絡中,將數據序列化后通過網絡傳輸到遠程節點,遠程服務器上的服務接收到數據將其反序列化,就可使用了;

但,要注意,遠程接收端,反序列化時,必須有對應的數據類型,否則會報錯,尤其是自定義類等,遠程必須要有;

兩端python環境要一致;是推到遠端,不是遠端來拉;

現在,大多數項目,都不是單機的,也不是單服務的,需要通過網絡將數據傳送到其節點上,這就需要大量的序列化和反序列化;

python程序間可用pickle解決序列化、反序列化;

如果是跨平臺,跨語言、跨協議,pickle就不太適合了,就需要公共的協議,如xmljsonprotocol bufferglogle)等;

不同的協議,效率不同,學習曲線不同,適用不同場景,要根據不同的情況分析選型;

?

例(內建類型listdict等,兩邊定義一致):

import pickle

?

lst = 'a b c'.split()

d = dict(zip('abc',range(3)))

?

with open('/home/python/magedu/projects/cmdb/bin','wb') as f:

??? pickle.dump(lst,f)

??? pickle.dump(d,f)

?

with open('/home/python/magedu/projects/cmdb/bin','rb') as f:

??? tmp = pickle.load(f)

??? print(type(tmp))

??? print(tmp)

??? tmp = pickle.load(f)

??? print(tmp)

注:

運行結果:

<class 'list'>

['a', 'b', 'c']

{'a': 0, 'b': 1, 'c': 2}

bin文件放至win上;

21文件IO_pickle

?21文件IO_pickle

例(類、類屬性、類方法,僅序列化類名,兩端若類定義不一致,在調用后會有問題):

import pickle

?

class AA:

??? def show(self):

??????? print('abc')

?

aa = AA()

?

with open('/home/python/magedu/projects/cmdb/bin2','wb') as f:

??? pickle.dump(aa,f)

?

with open('/home/python/magedu/projects/cmdb/bin2','rb') as f:

??? tmp = pickle.load(f)?? #重新實例化后,賦給tmp,和aa是不同的對象

??? tmp.show()

注:

運行結果:

abc

bin2傳至win主機:

21文件IO_pickle

21文件IO_pickle

linuxwin下,兩端若定義的AA不一樣,則有問題;

?

例(類、類屬性、類方法,僅序列化類名,兩端若類定義不一致,在調用后會有問題):

import pickle

?

class AA:

??? cccc = 'abc'?? #類屬性

??? def show(self):

??????? print('abcd')

?

with open('bin3','wb') as f:

??? pickle.dump(AA(),f)

?

with open('bin3','rb') as f:

??? t = pickle.load(f)

??? t.show()

??? print(t.cccc)

注:

運行結果:

abcd

abc

bin3傳至win主機:

21文件IO_pickle

21文件IO_pickle

?

例(對象屬性相關的,會序列化;而類方法、類屬性不會序列化(僅序列化類名)):

import pickle

?

class AA:

??? def __init__(self):

??????? self.aa = 'cc'?? #對象屬性,每個對象是獨立的,每個對象可改變此處定義

?

with open('bin4','wb') as f:

??? pickle.dump(AA(),f)

?

with open('bin4','rb') as f:

??? t = pickle.load(f)

??? print(t.aa)

注:

運行結果:

cc

bin4傳至win主機:

21文件IO_pickle

21文件IO_pickle

?

?


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

辽源市| 江津市| 兴海县| 淮滨县| 乌什县| 贵港市| 上虞市| 沅陵县| 南投市| 屯昌县| 泰顺县| 昭平县| 沿河| 青岛市| 阿荣旗| 江都市| 察雅县| 荆门市| 酒泉市| 蒲江县| 平昌县| 晋州市| 新巴尔虎左旗| 鸡泽县| 全南县| 新民市| 会理县| 九江市| 海盐县| 清苑县| 兴安县| 阿拉尔市| 留坝县| 宜章县| 定兴县| 天柱县| 张家口市| 西昌市| 香格里拉县| 墨玉县| 佛冈县|