因為TCP/IP協(xié)議只支持字節(jié)數(shù)組的傳輸,不能直接傳對象。對象序列化的結(jié)果一定是字節(jié)數(shù)組!當(dāng)兩個進程在進行遠程通信時,彼此可以發(fā)送各種類型的數(shù)據(jù)。無論是何種類型的數(shù)據(jù),都會以二進制序列的形式在網(wǎng)絡(luò)上傳送。發(fā)送方需要把這個對象轉(zhuǎn)換為字節(jié)序列,才能在網(wǎng)絡(luò)上傳送;接收方則需要把字節(jié)序列再恢復(fù)為對象。
創(chuàng)新互聯(lián)公司是專業(yè)的陸豐網(wǎng)站建設(shè)公司,陸豐接單;提供成都做網(wǎng)站、網(wǎng)站設(shè)計,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行陸豐網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
序列化(serialization):及有序的列,數(shù)據(jù)轉(zhuǎn)換成二進制的有序的過程
協(xié)議:規(guī)定序列化和反序列化的轉(zhuǎn)換方式及就是把數(shù)據(jù)保存成二進制存儲起來,其是定義的規(guī)則,其規(guī)則稱為協(xié)議如果規(guī)定了協(xié)議,則可以進行序列化和反序列化,其協(xié)議是由版本的,約定協(xié)議后進行處理反序列化(deserialization):將有序的二進制序列轉(zhuǎn)換成某種對象(字典,列表等)稱為反序列化
持久化:序列化保存到文件就是持久化,序列化未必會持久化,序列化往往是傳輸或存儲。可以將數(shù)據(jù)序列化后持久化,或者網(wǎng)絡(luò)傳輸,也可以將從文件或網(wǎng)絡(luò)接受到的字節(jié)序列反序列化。
pickle python中的序列化,反序列化模塊,其局限是僅限于傳輸?shù)膬啥硕际莗ython的情況,且盡量保持兩端的版本一致
dumps 對象序列化,在內(nèi)存中
dump 對象序列化到文件對象,就是存入文件
loads 對象反序列化
load 對象反序列化,從文件中讀取數(shù)據(jù)
#!/usr/local/bin/python3.6
#coding:utf-8
from pickle import *
from pathlib import Path
lst='a b c d'.split() #返回一個列表
d=dict(zip('abcd',range(4))) #構(gòu)建一個字典
print (lst,d) # 打印字典和列表
p=Path('/root/test.py')
if not p.parent.exists(): # 創(chuàng)建文件的上級目錄
p.parent.mkdir(parents=True)
with open(p,'wb+') as f: #進行序列化,必須是二進制的輸入,否則會報錯
dump(lst,f)
dump(d,f)
with open(p,'rb') as f: #此處對應(yīng)的是二進制的輸出
print (load(f))
print (load(f))
結(jié)果如下
#!/usr/local/bin/python3.6
#coding:utf-8
from pickle import *
from pathlib import Path
d=dict(zip('MySQL',range(5)))
s=dumps(d) #進行序列化
print (s) # 正常情況的輸出
print (loads(s)) # 進行反序列化并輸出
結(jié)果如下
切換3.5環(huán)境進行查看處理
對類的處理
#!/usr/local/bin/python3.6
#coding:utf-8
from pickle import *
from pathlib import Path
class A(): #創(chuàng)建一個類
def show(self):
print ('aaaa')
a=A() # 對類進行實例化
with open('/root/test1.py','wb+') as f: # 將實例化后的類的對象使用序列化寫入到文件中
dump(a,f)
with open('/root/test1.py','rb') as f: # 將對象的結(jié)果進行查看
x=load(f)
x.show()
結(jié)果如下
#!/usr/local/bin/python3.6
#coding:utf-8
from pickle import *
from pathlib import Path
class A(): #創(chuàng)建一個類
def show(self):
print ('aaaa')
print ('bbbbb')
a=A() # 對類進行實例化
with open('/root/test1.py','wb+') as f: # 將實例化后的類的對象使用序列化寫入到文件中
dump(a,f)
with open('/root/test1.py','rb') as f: # 將對象的結(jié)果進行查看
x=load(f)
x.show() # 調(diào)用類的方法
查看結(jié)果
寫入的數(shù)據(jù)如下
此處寫入的數(shù)據(jù)未發(fā)生改變,但其在類中增加了數(shù)據(jù),此處記錄的是模塊名和類名。若在不同的平臺進行操作,則會報錯
切換3.5環(huán)境,報錯,因為其中沒有這個test的模塊名沒有對應(yīng)的classA,因此會報錯。
對象序列化
#!/usr/local/bin/python3.6
#coding:utf-8
from pickle import *
from pathlib import Path
class A(): #創(chuàng)建一個類
def __init__(self): #對類進行初始化的操作,及就是在對象賦值時,此類會被帶入其中
self.tttt='abcdf'
a=A() # 對類進行實例化
with open('/root/test1.py','wb+') as f: # 將實例化后的類的對象使用序列化寫入到文件中
dump(a,f)
with open('/root/test1.py','rb') as f: # 將對象的結(jié)果進行查看
x=load(f)
print (x.tttt) # 調(diào)用類的方法
查看如下
查看寫入數(shù)據(jù),其發(fā)生了變化
但其切換環(huán)境,還是不能找到
RPC 雛形:
遠程過程調(diào)用: 及遠程調(diào)用某個模塊的函數(shù)來實現(xiàn)其過程的調(diào)用 ,必須要保證遠程的函數(shù)和本地需要的函數(shù)一致并且必須存在,否則會報錯
通過網(wǎng)絡(luò)傳輸,不需要持久化,進行類的一致性
對于非自定義類,兩邊一致,不需要,若是自定義類,則需要兩端保持一致
應(yīng)用:
本地序列化的情況,應(yīng)用較少
一般來說,大多數(shù)應(yīng)用場景在網(wǎng)絡(luò)中,將數(shù)據(jù)序列化后通過網(wǎng)絡(luò)傳輸?shù)竭h程結(jié)點,遠程服務(wù)器上的服務(wù)接受到數(shù)據(jù)后進行反序列化,就可以使用了。
但是,需要注意的是,遠端接受端,反序列化時必須有對應(yīng)的數(shù)據(jù)類型,否則就會報錯,尤其是自定義類,必須遠程存在
目前,大多數(shù)項目都不是單機,不是單服務(wù),需要通過網(wǎng)絡(luò)將數(shù)據(jù)傳送到其他結(jié)點上,這就需要大量的序列化,反序列化。
但是python程序之間還可以使用pickple解決序列化,反序列化,如果是跨平臺,跨語言,跨協(xié)議pickle就不適合了,就需要公共協(xié)議,如XML/Json /protocol Buffer等。
每種協(xié)議都有自己的負載,其所使用的場景都不一樣,二進制的操作不一定適用于所有的場景。但越是底層的協(xié)議,越需要二進制傳輸
JSON(JavaScript object notation,JS 對象標(biāo)記)是一種輕量級的數(shù)據(jù)交換格式,它基于ECMAscript(w3c制定的JS規(guī)范)的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù)
其key必須是字符串,其值可以是下面類型
雙引號引起來的字符串,數(shù)值,true和false,null(None),對象(字典),數(shù)組(列表)這些都是值
此處表示了JSON值支持的數(shù)據(jù)類型
1 string:
字符串,由雙引號包圍起來的任意字符的組合,可以有轉(zhuǎn)義字符
2 number :
數(shù)值,有正負數(shù),整數(shù),浮點數(shù)
3 對象:
無序的鍵值對集合
格式:{key1:value1,...keyn:valuen}
key 必須是字符串,需要使用雙引號包圍這個字符串,value可以是任意合法的值
其表示要么是{},要么有key,value,若key:value完成,則后面不能有逗號,一旦有逗號,則表示后面還有數(shù)據(jù)
4 數(shù)組 :
同上,一旦有逗號,則表示后面還有數(shù)據(jù)
此處的問題是,其json文件的鍵是非字符串,其值的字符串不是使用雙引號括起來的,因此其會出現(xiàn)報錯的情況
5 null 相當(dāng)于python的None
6 布爾型 false(False) true(True)
dumps json 編碼
dump json 編碼并存入文件
loads json 解碼
load json 解碼,從文件讀取數(shù)據(jù)
#!/usr/local/bin/python3.6
#coding:utf-8
from json import *
d={'a':1,'b':{'c':{'d':[1,23,4,5]}},'e':None,'f':True,'g':False} #構(gòu)造字典
print (d) # 輸出字典
print (dumps(d)) #對字典對象進行序列化
print (loads((dumps(d)))) # 對結(jié)果進行反序列化
結(jié)果如下
#!/usr/local/bin/python3.6
#coding:utf-8
from json import *
class A(): # 創(chuàng)建一個類
def show(self):
return 'mysql'
print (dumps(A().show())) # 對類進行實例化并調(diào)用其方法返回結(jié)果進行序列化
print (loads(dumps(A().show()))) # 對其進行反序列化
結(jié)果如下
一般的json編碼的數(shù)據(jù)很少落地,數(shù)據(jù)都是通過網(wǎng)絡(luò)傳輸,傳輸?shù)臅r候,要考慮壓縮它,本質(zhì)上來說它就是一個文本,一個字符串,json很廣泛,幾乎所有的編程語言都支持它。
messagepack 是一個基于二進制高效的對象序列化類庫,可用于跨語言通信,其可以像JSON那樣,在許多語言之間交換結(jié)構(gòu)對象,但是其比JSON更快速更輕巧。其支持python,ruby,Java,C/C++等眾多語言,兼容JSON和pickle
pip install msgpack-python
packb 序列化對象,提供了dumps來兼容pickle和json
unpackb 反序列化對象,提供了loads來兼容pack序列化對象保存到文件對象,提供了dump來兼容
unpack 反序列化對象保存到文件對象,提供了load來兼容
#!/usr/local/bin/python3.6
#coding:utf-8
from msgpack import *
import sys
d={'a':1234,'b':['abc',{'c':234}],'d':True,'e':False,'f':None} # 構(gòu)建一個字典
b=packb(d) # 進行序列化操作
print (b) # 打印
print (unpackb(b)) #進行反序列化操作
print (unpackb(b,encoding='utf-8')) #通過制定編碼方式輸出
結(jié)果如下
網(wǎng)頁標(biāo)題:python序列化和反序列化
URL網(wǎng)址:http://vcdvsql.cn/article14/gjiode.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計、移動網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)、定制網(wǎng)站、用戶體驗、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)