1. 程式人生 > >python序列化物件和反序列化

python序列化物件和反序列化

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