python之序列化反序列化



serialization序列化

    將內存中對象存儲下來,把它變成一個個字節python

deserialization反序列化服務器

    將文件的一個個字節恢復成內存中對象。網絡

序列化保存到文件就是持久化。能夠將數據序列化後持久化,或者網絡傳輸;也能夠將從文件中或者網絡接收到的字節序列反序列化。ide

python提供了pickle庫。
對象


dumps:對象序列化內存

dump對象序列化到文件對象,就是存入文件;get

loads:對象反序列化it

load對象反序列化,從文件讀取數據;io

import pickle


class AA:
    def show(self):
        print('abc')
        a = 'abcdefghigklmn'
        print(a)

aa = AA()


with open('bin', 'wb') as f:
    pickle.dump(aa, f)

with open('bin', 'rb') as f:
    tmp = pickle.load(f)
    print(tmp)
    tmp.show()

上面的實例中,其實就保存一個類名,由於全部的其餘東西都是類定義的東西,是不變的,因此只序列化一個AA類名。反序列化的時候找到類就能夠恢復一個對象。class

with open('bin', 'rb') as f:
    tmp = pickle.load(f)
    print(tmp)
    tmp.show()
    
AttributeError: Can't get attribute 'AA' on <module '__main__' from 'pic.py'>

上面這樣會拋出異常;

class AA:
    def show(self):
        print(123)

aa = AA()
with open('bin', 'rb') as f:
    tmp = pickle.load(f)
    print(tmp)
    tmp.show()

反序列化的時候要找到AA類的定義,才能成功。增長定義類便可解決。哪怕這個AA類不同。


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

通常來講,大多數場景都應用在網絡中。將數據序列化後經過網絡傳輸到遠程節點,遠程服務器上的服務將收到的數據反序列化後,就能夠使用了。

可是要注意一點,遠程接收端,反序列化時候必須有對應的數據類型,不然就會報錯。尤爲是自定義類,必須遠程得有。

相關文章
相關標籤/搜索