什么是序列化對象?
我們把對象(變量)從內存中編程可存儲或傳輸的過程稱之為序列化,在python中稱為pickle,其他語言稱之為serialization,marshalling,flatterning等等,都是一個意思。
序列化之后,就可以把序列化后的內容寫入磁盤,或者通過網絡傳輸到別的機器上(因為硬盤或網絡傳輸時只接受bytes)。
反過來,把變量內容從序列化的對象重新讀到內存里稱之為反序列化,即unpacking。
為什么要序列化?
舉個例子,你在打游戲過程中,打累了,停下來,想過兩天再玩,兩天之后,游戲又從你上次停止的地方繼續運行,你上次游戲的進度肯定保存到硬盤上了,那么是以何種形式呢?游戲過程中產生的很多臨時數據是不規律的,可能在你關掉游戲時正好是10個列表,3個嵌套字典的數據集合在內存里面,需要存下來,你如何存?把列表變成文件里的多行多列形式?那嵌套字典呢?根本沒法存吧,所以,若是有種辦法可以直接把內存數據存到硬盤上,下次程序再啟動,再從硬盤上讀出來,還是原來的格式,那是最好的,所以這就是我們要說的序列化。
1、持久保存狀態
一個軟件/程序的執行就在處理一系列狀態的變化,在編程語言中,‘狀態’會以各種各樣有結構的數據類型(也可以簡單的理解為變量)的形式被保存在內存中
內存是無法永久保存數據的,當程序運行了一段時間,我們斷電或者重啟程序,內存中關于這個程序的之前一段時間的數據(有結構)都被清空了。
在斷電或重啟程序之前將程序當前內存中所有的數據都保存下來(保存到文件中),以便于下次程序執行能夠從文件中載入之前的數據,然后繼續執行,這就是序列化。
2、跨平臺數據交互
序列化之后,不僅可以把序列化后的內容寫入磁盤,還可以通過網絡傳輸到別的機器上,如果收發的雙方約定好使用一種序列化的格式,那么變打破了平臺/語言差異化帶來的限制,實現了跨平臺的數據交互。
反過來,把變量內容從序列化的對象重新讀到內存里稱之為反序列化,即unpickling.
什么可以序列化操作?
在python中,可以使用pickle和json兩個模塊對數據進行序列化操作
其中:
json可以用于字符串或者字典等與python數據類型之間的序列化與反序列化操作
pickle可以用于python特有類型與python數據類型之間的序列化與反序列化操作
提問:這時候有人肯定要問,兩個都可以對數據進行序列化,為什么不只學習一個就好了,非要學習兩個呢?
這個問題問的好,我們下面詳細講一下兩個的區別。
關于json
優點:跨語言,體積小
缺點:只能支持int(整形),str(字符串),list(列表),tuple(元祖),dict(字典)
關于pickle
優點:專門為python設計,只支持python所有的數據類型
缺點:只能在python中使用,存儲數據占空間大
以上內容為大家介紹了python序列化及其相關模塊,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。