91直播在线观看www免费/日韩高清在线亚洲专区vr/国产精品午夜寂寞视频/亚瑟在线影院怎么下载

忠于品牌,精于技術(shù)

協(xié)議,序列化,XML,JSON是什么關(guān)系

產(chǎn)品經(jīng)理提出的需求經(jīng)常需要終端,后臺之間相互協(xié)作才能完成,而在功能開發(fā)的過程中經(jīng)常會聽到“定協(xié)議”這樣的詞,對這個詞大致的印象就是“兩個開發(fā)之間商量好怎么發(fā)數(shù)據(jù),然后就可以開始調(diào)試,逐漸完成功能了”。

對于邏輯上的協(xié)議,產(chǎn)品經(jīng)理可能并不陌生(甚至有些協(xié)議直接出自產(chǎn)品經(jīng)理之手),對協(xié)議內(nèi)容的描述類似于“0表示關(guān)閉功能,1表示開啟功能,用個type標(biāo)識來源...”。一旦邏輯上的協(xié)議確定了,不同的開發(fā)和產(chǎn)品之間相當(dāng)于在思想上達(dá)成了一致,然后圍繞協(xié)議來書寫各自的業(yè)務(wù)邏輯。

這一切似乎很自然,就如我們走路一般。正因?yàn)樘匀唬晕覀兘?jīng)常會忽略一些基礎(chǔ)設(shè)施,就如我們腳下的路一般。仔細(xì)想想,雖然邏輯上的協(xié)議確定了,終端和后臺之間還需要跨越網(wǎng)絡(luò),甚至還需要跨越平臺的進(jìn)行協(xié)議的傳輸和解析,那么邏輯上制定的那些協(xié)議又要如何在復(fù)雜的環(huán)境中正確的傳輸和解析呢?

先來了解一下基本數(shù)據(jù)類型。各種編程語言中都有自己的基本數(shù)據(jù)類型(大同小異),比如bool(布爾型),int(整形),float(浮點(diǎn)型),String(字符串)等等,這些數(shù)據(jù)都是可以在內(nèi)存中存儲,計(jì)算的,對計(jì)算機(jī)來說都是一種二進(jìn)制的數(shù)據(jù)表示(計(jì)算機(jī)只懂二級制)。我們把這些基本數(shù)據(jù)類型按照業(yè)務(wù)的需要組合起來形成更大的數(shù)據(jù)結(jié)構(gòu)體。像制定的協(xié)議,也是數(shù)據(jù)結(jié)構(gòu)體的一種,所以協(xié)議經(jīng)常是這個樣子:

Protocol

{

boolean isEnable;

int from;

String message;

...

}

雖然這里的數(shù)據(jù)結(jié)構(gòu)體比基本數(shù)據(jù)類型復(fù)雜了一些,但是對計(jì)算機(jī)來說只是把幾個二進(jìn)制數(shù)據(jù)表示拼接到一起了而已。使用基本數(shù)據(jù)類型或基本數(shù)據(jù)類型的組合的好處就是計(jì)算機(jī)可以方便的讀寫(因?yàn)槎际嵌M(jìn)制),這里強(qiáng)調(diào)基本數(shù)據(jù)類型是為了引入一個概念————序列化。

序列化就是將數(shù)據(jù)對象轉(zhuǎn)成二進(jìn)制串,反序列化就是將二進(jìn)制串還原成數(shù)據(jù)對象,能夠被序列化是數(shù)據(jù)對象能夠持久化(保存到硬盤)或是在網(wǎng)絡(luò)中,不同平臺間互相傳輸?shù)南葲Q條件。當(dāng)然,不僅僅是基本數(shù)據(jù)類型,只要能夠被表示成二進(jìn)制的對象都是可以序列化的,比如一張圖片,在計(jì)算機(jī)中圖片是用bitmap表示的,同樣也是二進(jìn)制串。你可能會問,那什么是不能夠被序列化的呢?比如按鈕(Button)這種對象就不能被序列化,你沒聽說要把一個按鈕保存到文件里面,或者把一個按鈕傳到服務(wù)器吧。

能夠被序列化僅僅解決了協(xié)議傳輸?shù)膯栴},但是為了協(xié)議的收發(fā)雙方能夠方便的解析協(xié)議,還需要遵循一些通用的協(xié)議表示的規(guī)范。基本數(shù)據(jù)類型里擴(kuò)展性最好的就是字符串,管你什么bool,int,float,字符串都能間接表示,比如1->"1",true->"true",3.14->"3.14"醬紫,所以在此基礎(chǔ)上,出現(xiàn)了一些用字符串來表示數(shù)據(jù)結(jié)構(gòu)對象的協(xié)議,比如XML,JSON(一步一步寫爬蟲之JSON解析)等,使用這種協(xié)議的收發(fā)雙方在語義上都是使用的可理解的字符串傳輸,通過一些特殊的標(biāo)記、分隔符來模塊化數(shù)據(jù)表示。


所以協(xié)議的收發(fā)過程變成了,發(fā)送方將協(xié)議制定的字段寫成XML或者JSON格式的字符串,序列化之后傳輸,接收方反序列化還原出字符串,然后按照XML或者JSON格式取出傳過來的各個協(xié)議字段。如果要求苛刻一點(diǎn)就會發(fā)現(xiàn)這兩種協(xié)議序列化后大部分情況下有空間浪費(fèi),比如協(xié)議中的數(shù)據(jù)都是可以通過byte來表示的,即用1,2,3這種簡單的數(shù)字形式來表示,這時用字符串表示顯然有些空間浪費(fèi)了,所以很多公司在序列化反序列化的理論基礎(chǔ)上做了自己的解析協(xié)議,盡可能的減少協(xié)議存儲和傳輸?shù)拇笮。敲丛趨f(xié)議多,用戶量大的情況下,傳輸數(shù)據(jù)量的節(jié)省就非常可觀了。