bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

python序列化和反序列化

一 概述

1 為什么要序列化

因為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è)前來合作!

2 序列化和反序列化

序列化(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é)序列反序列化。

二 python pickle

1 概述

pickle python中的序列化,反序列化模塊,其局限是僅限于傳輸?shù)膬啥硕际莗ython的情況,且盡量保持兩端的版本一致

2 pickle 庫基本方法

dumps 對象序列化,在內(nèi)存中
dump 對象序列化到文件對象,就是存入文件
loads 對象反序列化
load 對象反序列化,從文件中讀取數(shù)據(jù)

3 實例

#!/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é)果如下

python 序列化和反序列化

#!/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é)果如下
python 序列化和反序列化

切換3.5環(huán)境進行查看處理
python 序列化和反序列化

對類的處理

#!/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é)果如下

python 序列化和反序列化

python 序列化和反序列化

#!/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é)果
python 序列化和反序列化
寫入的數(shù)據(jù)如下
python 序列化和反序列化

此處寫入的數(shù)據(jù)未發(fā)生改變,但其在類中增加了數(shù)據(jù),此處記錄的是模塊名和類名。若在不同的平臺進行操作,則會報錯

切換3.5環(huán)境,報錯,因為其中沒有這個test的模塊名沒有對應(yīng)的classA,因此會報錯。

python 序列化和反序列化

對象序列化

#!/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)用類的方法

查看如下
python 序列化和反序列化
查看寫入數(shù)據(jù),其發(fā)生了變化

python 序列化和反序列化
但其切換環(huán)境,還是不能找到
python 序列化和反序列化

4 總結(jié)

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

1 概述

JSON(JavaScript object notation,JS 對象標(biāo)記)是一種輕量級的數(shù)據(jù)交換格式,它基于ECMAscript(w3c制定的JS規(guī)范)的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù)

2 JSON的數(shù)據(jù)類型

其key必須是字符串,其值可以是下面類型

雙引號引起來的字符串,數(shù)值,true和false,null(None),對象(字典),數(shù)組(列表)這些都是值

python 序列化和反序列化
此處表示了JSON值支持的數(shù)據(jù)類型

1 string:

字符串,由雙引號包圍起來的任意字符的組合,可以有轉(zhuǎn)義字符


2 number :
數(shù)值,有正負數(shù),整數(shù),浮點數(shù)


3 對象:
無序的鍵值對集合
格式:{key1:value1,...keyn:valuen}
key 必須是字符串,需要使用雙引號包圍這個字符串,value可以是任意合法的值

python 序列化和反序列化

其表示要么是{},要么有key,value,若key:value完成,則后面不能有逗號,一旦有逗號,則表示后面還有數(shù)據(jù)


4 數(shù)組 :
python 序列化和反序列化

同上,一旦有逗號,則表示后面還有數(shù)據(jù)

python 序列化和反序列化

此處的問題是,其json文件的鍵是非字符串,其值的字符串不是使用雙引號括起來的,因此其會出現(xiàn)報錯的情況


5 null 相當(dāng)于python的None


6 布爾型 false(False) true(True)

3 常用方法

dumps json 編碼
dump json 編碼并存入文件
loads json 解碼
load json 解碼,從文件讀取數(shù)據(jù)

4 應(yīng)用

#!/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é)果如下
python 序列化和反序列化

#!/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é)果如下
python 序列化和反序列化

一般的json編碼的數(shù)據(jù)很少落地,數(shù)據(jù)都是通過網(wǎng)絡(luò)傳輸,傳輸?shù)臅r候,要考慮壓縮它,本質(zhì)上來說它就是一個文本,一個字符串,json很廣泛,幾乎所有的編程語言都支持它。

四 messagepack(第三方庫)

1 概述

messagepack 是一個基于二進制高效的對象序列化類庫,可用于跨語言通信,其可以像JSON那樣,在許多語言之間交換結(jié)構(gòu)對象,但是其比JSON更快速更輕巧。其支持python,ruby,Java,C/C++等眾多語言,兼容JSON和pickle

2 安裝

pip install msgpack-python

3 常用方法

packb 序列化對象,提供了dumps來兼容pickle和json
unpackb 反序列化對象,提供了loads來兼容

pack序列化對象保存到文件對象,提供了dump來兼容
unpack 反序列化對象保存到文件對象,提供了load來兼容

4 基本應(yīng)用

#!/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é)果如下
python 序列化和反序列化

網(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)

網(wǎng)站托管運營