Python中的序列化詳細(xì)解析
1.什么是數(shù)據(jù)序列化?
序列化 (Serialization),是指把程序中的一個(gè)類(lèi)轉(zhuǎn)化成一個(gè)標(biāo)準(zhǔn)化的格式。
標(biāo)準(zhǔn)化的意義是這個(gè)格式可以跨程序,跨平臺(tái)的被使用,而且保持其原有的內(nèi)容,規(guī)范。
2.為什么要進(jìn)行數(shù)據(jù)序列化呢?
(1)一致性
我們將要保存的數(shù)據(jù),序列化成標(biāo)準(zhǔn)的格式(Json格式或者Pickle格式)。之后再反序列化回來(lái),數(shù)據(jù)依然是原來(lái)的。保持了數(shù)據(jù)的一致性。
(2)有效性
序列化之后,可以減少內(nèi)存和網(wǎng)絡(luò)資源的占用。
(3)兼容性
將數(shù)據(jù)序列化之后,Json格式或者Pickle格式,我可以在其他平臺(tái)(其他操作系統(tǒng)的電腦)上依然使用。 我用python對(duì)數(shù)據(jù)進(jìn)行了序列化,我之后可以使用java等其他語(yǔ)言,對(duì)其進(jìn)行反序列,然后進(jìn)行使用,數(shù)據(jù)并沒(méi)有發(fā)生改變。
3.數(shù)據(jù)序列化的應(yīng)用
(1)應(yīng)用一
你的程序需要和其他程序交流,例如 平臺(tái) API, 網(wǎng)頁(yè)請(qǐng)求
(2)應(yīng)用二
串行任務(wù)流,每一個(gè)任務(wù)結(jié)束之后數(shù)據(jù)通過(guò)序列化傳遞到下一個(gè)任務(wù)。
4.JSON
JSON 是一個(gè)文件格式,也是一個(gè)標(biāo)準(zhǔn)化的數(shù)據(jù)傳輸方案,通常網(wǎng)站的后端和前端的交流,移動(dòng) APP 和云服務(wù)器的交流方式都是通過(guò) JSON。
(1)序列化
# 導(dǎo)入json模塊 import json simple_dict = {'name': 'zxy', 'age': 21} with open('simple_dict.txt', 'w') as file_to_write: # 進(jìn)行json序列化,然后寫(xiě)入simple_dict.txt文件中 json.dump(simple_dict, file_to_write)
(2)反序列化
with open('simple_dict.txt', 'r') as file_to_read: loaded_simple_dict = json.load(file_to_read) print(loaded_simple_dict) print(type(loaded_simple_dict))
(3)Json 方法的弊端
當(dāng)遇到一些 Python 特定的高級(jí)數(shù)據(jù)類(lèi)型的時(shí)候,Json 會(huì)因?yàn)闆](méi)有標(biāo)準(zhǔn)而無(wú)法進(jìn)行序列化。 會(huì)報(bào)如下錯(cuò)誤:
5.Pickle
Pickle 和 Json 不同的是,Pickle 是 Python 專(zhuān)屬的序列化方案,可以轉(zhuǎn)化大多數(shù) Python 的數(shù)據(jù)類(lèi)型,并且儲(chǔ)存方式是二進(jìn)制(Byte Code)。二進(jìn)制的儲(chǔ)存方式只有機(jī)器才能理解,但是同時(shí)也保證了一定的數(shù)據(jù)隱秘性和高效性。
(1)序列化
import pickle import datetime abc_dict = {datetime.datetime(2019, 7, 18, 0, 0): 9682.24, datetime.datetime(2019, 7, 17, 0, 0): 9411.61, datetime.datetime(2019, 7, 16, 0, 0): 10858.7, datetime.datetime(2019, 7, 15, 0, 0): 10195.0, datetime.datetime(2019, 7, 14, 0, 0): 11378.23, datetime.datetime(2019, 7, 13, 0, 0): 11810.0, datetime.datetime(2019, 7, 12, 0, 0): 11338.9, datetime.datetime(2019, 7, 11, 0, 0): 12090.99, datetime.datetime(2019, 7, 10, 0, 0): 12577.85} with open('abc.pk', 'wb') as file_to_write: pickle.dump(abc_dict, file_to_write)
二進(jìn)制的儲(chǔ)存方式只有機(jī)器才能理解,保證了一定的數(shù)據(jù)隱秘性和高效性。
(2)反序列化
import pickle import datetime abc_dict = {datetime.datetime(2019, 7, 18, 0, 0): 9682.24, datetime.datetime(2019, 7, 17, 0, 0): 9411.61, datetime.datetime(2019, 7, 16, 0, 0): 10858.7, datetime.datetime(2019, 7, 15, 0, 0): 10195.0, datetime.datetime(2019, 7, 14, 0, 0): 11378.23, datetime.datetime(2019, 7, 13, 0, 0): 11810.0, datetime.datetime(2019, 7, 12, 0, 0): 11338.9, datetime.datetime(2019, 7, 11, 0, 0): 12090.99, datetime.datetime(2019, 7, 10, 0, 0): 12577.85} with open('abc.pk', 'wb') as file_to_write: # pickle序列化,然后以二進(jìn)制的形式存入文件中 pickle.dump(abc_dict, file_to_write) with open('abc.pk', 'rb') as file_to_read: # 以二進(jìn)制的形式進(jìn)行讀取文件 abc_dict_pk = pickle.load(file_to_read) print(abc_dict_pk) print(type(abc_dict_pk))
6.總結(jié)
這里兩個(gè)方法的行為都是在序列化數(shù)據(jù),所以在調(diào)用函數(shù)上感覺(jué)完全一樣。
但是本質(zhì)上 Json 寫(xiě)入文件的是字符串,而 Pickle 則是把數(shù)據(jù)轉(zhuǎn)化成了二進(jìn)制,兩個(gè)是完全不同的處理方案。
到此這篇關(guān)于Python中的序列化詳細(xì)解析的文章就介紹到這了,更多相關(guān)Python中的序列化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)的中國(guó)剩余定理算法示例
這篇文章主要介紹了Python實(shí)現(xiàn)的中國(guó)剩余定理算法,結(jié)合實(shí)例形式分析了中國(guó)剩余定理的概念、原理及具體算法實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-08-08淺談在django中使用redirect重定向數(shù)據(jù)傳輸?shù)膯?wèn)題
這篇文章主要介紹了淺談在django中使用redirect重定向數(shù)據(jù)傳輸?shù)膯?wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Python3 socket即時(shí)通訊腳本實(shí)現(xiàn)代碼實(shí)例(threading多線(xiàn)程)
這篇文章主要介紹了Python3 socket即時(shí)通訊腳本實(shí)現(xiàn)代碼實(shí)例(threading多線(xiàn)程),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06使用python語(yǔ)言,比較兩個(gè)字符串是否相同的實(shí)例
今天小編就為大家分享一篇使用python語(yǔ)言,比較兩個(gè)字符串是否相同的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Python_查看sqlite3表結(jié)構(gòu),查詢(xún)語(yǔ)句的示例代碼
今天小編就為大家分享一篇Python_查看sqlite3表結(jié)構(gòu),查詢(xún)語(yǔ)句的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07