什么叫序列化?
序列化是指把內(nèi)存里的數(shù)據(jù)類(lèi)型轉(zhuǎn)變成字符串,以使其能存儲(chǔ)到硬盤(pán)或通過(guò)網(wǎng)絡(luò)傳輸?shù)竭h(yuǎn)程,因?yàn)橛脖P(pán)或網(wǎng)絡(luò)傳輸時(shí)只能接受bytes
為什么要序列化嗽元?
你打游戲過(guò)程中钾挟,打累了洁灵,停下來(lái),關(guān)掉游戲掺出、想過(guò)2天再玩徽千,2天之后,游戲又從你上次停止的地方繼續(xù)運(yùn)行汤锨,你上次游戲的進(jìn)度肯定保存在硬盤(pán)上了双抽,是以何種形式呢?游戲過(guò)程中產(chǎn)生的很多臨時(shí)數(shù)據(jù)是不規(guī)律的闲礼,可能在你關(guān)掉游戲時(shí)正好有10個(gè)列表牍汹,3個(gè)嵌套字典的數(shù)據(jù)集合在內(nèi)存里,需要存下來(lái)柬泽?你如何存慎菲?把列表變成文件里的多行多列形式?那嵌套字典呢锨并?根本沒(méi)法存露该。所以,若是有種辦法可以直接把內(nèi)存數(shù)據(jù)存到硬盤(pán)上第煮,下次程序再啟動(dòng)解幼,再?gòu)挠脖P(pán)上讀回來(lái),還是原來(lái)的格式的話包警,那是極好的撵摆。
用于序列化的兩個(gè)模塊
json,用于字符串 和 python數(shù)據(jù)類(lèi)型間進(jìn)行轉(zhuǎn)換
pickle害晦,用于python特有的類(lèi)型 和 python的數(shù)據(jù)類(lèi)型間進(jìn)行轉(zhuǎn)換
pickle模塊提供了四個(gè)功能:dumps特铝、dump、loads、load
import pickle
data = {'k1':123,'k2':'Hello'}
# pickle.dumps 將數(shù)據(jù)通過(guò)特殊的形式轉(zhuǎn)換位只有python語(yǔ)言認(rèn)識(shí)的字符串
p_str = pickle.dumps(data)? # 注意dumps會(huì)把數(shù)據(jù)變成bytes格式
print(p_str)
# pickle.dump 將數(shù)據(jù)通過(guò)特殊的形式轉(zhuǎn)換位只有python語(yǔ)言認(rèn)識(shí)的字符串鲫剿,并寫(xiě)入文件
with open('result.pk',"wb") as fp:
? ? pickle.dump(data,fp)
# pickle.load? 從文件里加載
f = open("result.pk","rb")
d = pickle.load(f)
print(d)
Json模塊也提供了四個(gè)功能:dumps痒芝、dump、loads牵素、load严衬,用法跟pickle一致
import json
# json.dumps 將數(shù)據(jù)通過(guò)特殊的形式轉(zhuǎn)換位所有程序語(yǔ)言都認(rèn)識(shí)的字符串
j_str = json.dumps(data) # 注意json dumps生成的是字符串,不是bytes
print(j_str)
#dump入文件
with open('result.json','w') as fp:
? ? json.dump(data,fp)
#從文件里load
with open("result.json") as f:
? ? d = json.load(f)
? ? print(d)
json vs pickle:
JSON:
優(yōu)點(diǎn):跨語(yǔ)言(不同語(yǔ)言間的數(shù)據(jù)傳遞可用json交接)笆呆、體積小
缺點(diǎn):只能支持int\str\list\tuple\dict
Pickle:
優(yōu)點(diǎn):專(zhuān)為python設(shè)計(jì)请琳,支持python所有的數(shù)據(jù)類(lèi)型
缺點(diǎn):只能在python中使用,存儲(chǔ)數(shù)據(jù)占空間大