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 

 

 
        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM