1.首先不管哪種語言都會用到序列化和反序列化的過程,
2.序列化:把對象轉換為字節序列的過程稱為對象的序列化; 反序列化:把對象轉換為字節序列的過程稱為對象的序列化。
3.序列化的作用:把對象(變量)從內存中變成可存儲或傳輸的二進制對象,序列化之后的內容就可以寫入磁盤,或者通過網絡傳輸到別的機器上,同理,反序列化實現,把變量內容從序列化的對象重新讀取到內存
4.如何實現序列化?比如我們要在不同的編程語言之間傳遞對象,就必須把對象序列化為標准格式,例如xml,json。
json是標准的JavaScript語言的對象,其實就是字符串,可以被所有語言讀取,也可以方便的存儲到磁盤或者網絡傳輸。
5.JSON和Python的關系?兩者內置的數據類型對應關系如下
6.在python中json只能轉換一部分對象。類,函數無法轉換,就要用到pickle,但pickle只適用在python內部適用,shelve模塊也是python內部使用
舉例說明
1.想要把一個列表寫進文件
import json mq=[1,'e','r','m',4] with open('json_te','w') as fm: json.dump(mq,fm)
如下,不調用dumps序列化,則直接報錯,write()的參數必須是str類型
import json
mq=[1,'e','r','m',4] #mq=json.dumps(mq) with open('json_te','w') as fm: fm.write(mq) #TypeError: write() argument must be str, not list
修改以上代碼:執行成功
import json
mq=[1,'e','r','m',4] mq=json.dumps(mq) with open('json_te','w') as fm: fm.write(mq)
2.以上代碼還可以用dump替代,體現了dump和dumps之間的區別
import json mq=[1,'e','r','m',4] with open('json_te','w') as fm: json.dump(mq,fm)
3.對於從文件中讀取該列表就體現了,反序列化的過程,如下過程,直接讀取出來的是str,程序把文件內容作為一個長的字符串
import json with open ('json_te','r') as fn: con=fn.read() print(type(con)) #<class 'str'> print(con[2]) #'
4.以下對比,反序列化處理的結果
import json with open ('json_te','r') as fn: con=fn.read() con=json.loads(con) print(type(con)) #<class 'list'> print(con[2]) # r
5.反序列化的另一種表達方式
import json with open ('json_te','r') as fn: con=json.load(fn) print(type(con)) #<class 'list'>
6.json的dumps和loads,不能處理像函數/類,這就需要用到pickle
import json def addmd(a,b): return int(a)+int(b) with open('pick_te','w') as fa: json.dump(fa,addmd) #TypeError: <_io.TextIOWrapper name='pick_te' mode='w' encoding='cp936'> is not JSON serializable
對比以下用pickle實現
import pickle def addmd(): return 1+1 addmd=pickle.dumps(addmd) with open('pick_te','wb') as fa: fa.write(addmd
7.還有一個shelve模塊,只有包含一個open函數,返回像字典一樣的對象,直接實現文件中內容的修改添加,比JSON方便但是其他語言不通用。
import shelve md=shelve.open('dict_t') md['name']='xiaohong ' print(md['name']) #xiaohong