真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python序列化和反序列化-創(chuàng)新互聯(lián)

一 概述

1 為什么要序列化

因為TCP/IP協(xié)議只支持字節(jié)數(shù)組的傳輸,不能直接傳對象。對象序列化的結果一定是字節(jié)數(shù)組!當兩個進程在進行遠程通信時,彼此可以發(fā)送各種類型的數(shù)據(jù)。無論是何種類型的數(shù)據(jù),都會以二進制序列的形式在網(wǎng)絡上傳送。發(fā)送方需要把這個對象轉換為字節(jié)序列,才能在網(wǎng)絡上傳送;接收方則需要把字節(jié)序列再恢復為對象。

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比魯山網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式魯山網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋魯山地區(qū)。費用合理售后完善,10余年實體公司更值得信賴。

2 序列化和反序列化

序列化(serialization):及有序的列,數(shù)據(jù)轉換成二進制的有序的過程
協(xié)議:規(guī)定序列化和反序列化的轉換方式及就是把數(shù)據(jù)保存成二進制存儲起來,其是定義的規(guī)則,其規(guī)則稱為協(xié)議如果規(guī)定了協(xié)議,則可以進行序列化和反序列化,其協(xié)議是由版本的,約定協(xié)議后進行處理

反序列化(deserialization):將有序的二進制序列轉換成某種對象(字典,列表等)稱為反序列化

持久化:序列化保存到文件就是持久化,序列化未必會持久化,序列化往往是傳輸或存儲。可以將數(shù)據(jù)序列化后持久化,或者網(wǎng)絡傳輸,也可以將從文件或網(wǎng)絡接受到的字節(jié)序列反序列化。

二 python pickle

1 概述

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

2 pickle 庫基本方法

dumps 對象序列化,在內存中
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)))  #構建一個字典
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: #此處對應的是二進制的輸出
    print (load(f))
    print  (load(f))

結果如下

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))  # 進行反序列化并輸出

結果如下
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: # 將對象的結果進行查看
    x=load(f)
    x.show()

結果如下

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: # 將對象的結果進行查看
    x=load(f)
    x.show()  # 調用類的方法

查看結果
python 序列化和反序列化
寫入的數(shù)據(jù)如下
python 序列化和反序列化

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

切換3.5環(huán)境,報錯,因為其中沒有這個test的模塊名沒有對應的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: # 將對象的結果進行查看
    x=load(f)
    print (x.tttt)  # 調用類的方法

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

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

4 總結

RPC 雛形:
遠程過程調用: 及遠程調用某個模塊的函數(shù)來實現(xiàn)其過程的調用 ,必須要保證遠程的函數(shù)和本地需要的函數(shù)一致并且必須存在,否則會報錯
通過網(wǎng)絡傳輸,不需要持久化,進行類的一致性
對于非自定義類,兩邊一致,不需要,若是自定義類,則需要兩端保持一致


應用:
本地序列化的情況,應用較少
一般來說,大多數(shù)應用場景在網(wǎng)絡中,將數(shù)據(jù)序列化后通過網(wǎng)絡傳輸?shù)竭h程結點,遠程服務器上的服務接受到數(shù)據(jù)后進行反序列化,就可以使用了。
但是,需要注意的是,遠端接受端,反序列化時必須有對應的數(shù)據(jù)類型,否則就會報錯,尤其是自定義類,必須遠程存在


目前,大多數(shù)項目都不是單機,不是單服務,需要通過網(wǎng)絡將數(shù)據(jù)傳送到其他結點上,這就需要大量的序列化,反序列化。
但是python程序之間還可以使用pickple解決序列化,反序列化,如果是跨平臺,跨語言,跨協(xié)議pickle就不適合了,就需要公共協(xié)議,如XML/Json /protocol Buffer等。
每種協(xié)議都有自己的負載,其所使用的場景都不一樣,二進制的操作不一定適用于所有的場景。但越是底層的協(xié)議,越需要二進制傳輸

三 JSON

1 概述

JSON(JavaScript object notation,JS 對象標記)是一種輕量級的數(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:

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


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 相當于python的None


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

3 常用方法

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

4 應用

#!/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}  #構造字典
print (d)  # 輸出字典
print  (dumps(d))  #對字典對象進行序列化
print (loads((dumps(d))))  # 對結果進行反序列化

結果如下
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()))  # 對類進行實例化并調用其方法返回結果進行序列化
print (loads(dumps(A().show())))  # 對其進行反序列化

結果如下
python 序列化和反序列化

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

四 messagepack(第三方庫)

1 概述

messagepack 是一個基于二進制高效的對象序列化類庫,可用于跨語言通信,其可以像JSON那樣,在許多語言之間交換結構對象,但是其比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 基本應用

#!/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}  # 構建一個字典
b=packb(d)  # 進行序列化操作
print (b) # 打印
print (unpackb(b))  #進行反序列化操作
print (unpackb(b,encoding='utf-8'))  #通過制定編碼方式輸出

結果如下
python 序列化和反序列化

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。


分享文章:python序列化和反序列化-創(chuàng)新互聯(lián)
鏈接地址:http://weahome.cn/article/cosgdi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部