一種封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的方法和裝置制造方法
【專利摘要】本發(fā)明公開(kāi)了一種封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的方法,包括:根據(jù)二進(jìn)制協(xié)議數(shù)據(jù)的結(jié)構(gòu)化數(shù)據(jù)設(shè)置對(duì)應(yīng)的封裝配置和解析配置;服務(wù)端預(yù)先保存封裝配置,客戶端預(yù)先保存解析配置;服務(wù)端根據(jù)封裝配置對(duì)二進(jìn)制協(xié)議數(shù)據(jù)的結(jié)構(gòu)化數(shù)據(jù)進(jìn)行封裝,得到協(xié)議串;客戶端根據(jù)對(duì)應(yīng)的解析配置對(duì)協(xié)議串進(jìn)行解析,得到結(jié)構(gòu)化數(shù)據(jù);本發(fā)明還公開(kāi)了一種封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的裝置。通過(guò)本發(fā)明能夠降低二進(jìn)制協(xié)議的實(shí)現(xiàn)與維護(hù)成本。
【專利說(shuō)明】一種封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的方法和裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)封裝和解析技術(shù),特別是指一種封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的方法和裝置。
【背景技術(shù)】
[0002]在網(wǎng)絡(luò)分布式集群中,通常充斥著各式各樣的自定義二進(jìn)制協(xié)議。為了在不同的語(yǔ)言,不同的系統(tǒng)平臺(tái)上使用這些二進(jìn)制協(xié)議,開(kāi)發(fā)人員不得不針對(duì)各種語(yǔ)言及系統(tǒng)平臺(tái)做出不同的實(shí)現(xiàn)。如圖1所示,按照傳統(tǒng)的實(shí)現(xiàn)方式,為了在不同的語(yǔ)言,不同的系統(tǒng)平臺(tái)上使用多種二進(jìn)制協(xié)議,需要為每一種二進(jìn)制協(xié)議做出單獨(dú)的實(shí)現(xiàn),如圖所示:將每種二進(jìn)制協(xié)議(圖中所示為接口)的數(shù)據(jù)和數(shù)據(jù)的含義表述信息放到一個(gè)信息體中,形成結(jié)構(gòu)化數(shù)據(jù),并分別進(jìn)行C++實(shí)現(xiàn)、Java實(shí)現(xiàn)、PHP實(shí)現(xiàn)和Python實(shí)現(xiàn)等,之后,將C++版本的接口、Java版本的接口、PHP版本的接口和Python版本的接口等分別按照該接口中定義的封裝方式(定義協(xié)議的輸入與輸出方法中包括了對(duì)封裝方式的定義)進(jìn)行封裝;在這種傳統(tǒng)的實(shí)現(xiàn)方式中,不同的接口中定義的封裝方式不同、如N個(gè)接口中的每個(gè)接口定義的封裝方式都可能不同。
[0003]由此可見(jiàn),由于每種接口定義的封裝方式不同,導(dǎo)致需要對(duì)每種接口、以及每種接口的各個(gè)版本單獨(dú)實(shí)現(xiàn)并單獨(dú)維護(hù),因?yàn)榫W(wǎng)絡(luò)分布式集群中充斥著各式各樣的自定義接口,這樣會(huì)帶來(lái)超高的實(shí)現(xiàn)與維護(hù)成本。
[0004]為了減少成本,部分系統(tǒng)中會(huì)嘗試使用統(tǒng)一的通用協(xié)議來(lái)實(shí)現(xiàn)。如圖2所示,所有接口都使用統(tǒng)一的通用協(xié)議來(lái)封裝各自的C++版本、Java版本、PHP版本和Python版本等。統(tǒng)一的通用協(xié)議,例如json、protobuf、thrift等。
[0005]如果采用圖1所示的傳統(tǒng)的方式來(lái)開(kāi)發(fā)一個(gè)大型的系統(tǒng),開(kāi)發(fā)者將面臨難以估量的開(kāi)發(fā)與維護(hù)成本。采用圖2所示的統(tǒng)一的通用協(xié)議是一個(gè)降低實(shí)現(xiàn)與維護(hù)成本的好方法,但是也會(huì)存在如下的問(wèn)題:
[0006]1、統(tǒng)一的通用協(xié)議需要將數(shù)據(jù)含義的表述信息存入結(jié)構(gòu)化數(shù)據(jù)中,而這部分信息本來(lái)只需由客戶端與服務(wù)端自行約定、不需要放到結(jié)構(gòu)化數(shù)據(jù)中,統(tǒng)一的通用協(xié)議這樣的做法將使得協(xié)議的體積變得龐大;
[0007]2、為了達(dá)到通用的目的,統(tǒng)一的通用協(xié)議中需要制訂一些規(guī)范與約定,這樣做會(huì)使得協(xié)議喪失一定的靈活性;
[0008]3、在大型分布式系統(tǒng)中,通常已存在很多以圖1所示的傳統(tǒng)方式實(shí)現(xiàn)的穩(wěn)定服務(wù),全部統(tǒng)一成通用協(xié)議需要很大的改造成本。
【發(fā)明內(nèi)容】
[0009]有鑒于此,本發(fā)明的主要目的在于提供一種封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的方法和裝置,解決傳統(tǒng)實(shí)現(xiàn)方式以及統(tǒng)一的通用協(xié)議實(shí)現(xiàn)方式導(dǎo)致的二進(jìn)制協(xié)議實(shí)現(xiàn)與維護(hù)成本大、協(xié)議體積龐大、協(xié)議靈活性低等問(wèn)題。[0010]為達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的:
[0011]本發(fā)明提供了一種封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的方法,根據(jù)二進(jìn)制協(xié)議數(shù)據(jù)的結(jié)構(gòu)化數(shù)據(jù)設(shè)置對(duì)應(yīng)的封裝配置和解析配置,該方法還包括:
[0012]服務(wù)端預(yù)先保存封裝配置,客戶端預(yù)先保存解析配置;
[0013]服務(wù)端根據(jù)所述封裝配置對(duì)二進(jìn)制協(xié)議數(shù)據(jù)的結(jié)構(gòu)化數(shù)據(jù)進(jìn)行封裝,得到協(xié)議串;
[0014]客戶端根據(jù)對(duì)應(yīng)的所述解析配置對(duì)所述協(xié)議串進(jìn)行解析,得到所述結(jié)構(gòu)化數(shù)據(jù)。
[0015]所述結(jié)構(gòu)化數(shù)據(jù)包括一個(gè)或多個(gè)數(shù)據(jù)元素;所述數(shù)據(jù)元素包括:類(lèi)型、屬性名和值。
[0016]所述數(shù)據(jù)元素還包括長(zhǎng)度。
[0017]所述服務(wù)端根據(jù)所述封裝配置對(duì)二進(jìn)制協(xié)議數(shù)據(jù)的結(jié)構(gòu)化數(shù)據(jù)進(jìn)行封裝,包括:
[0018]服務(wù)端將結(jié)構(gòu)化數(shù)據(jù)的各數(shù)據(jù)元素的值按照各數(shù)據(jù)元素在結(jié)構(gòu)化數(shù)據(jù)中的排列順序依次封裝到協(xié)議串中;
[0019]各數(shù)據(jù)元素的值在協(xié)議串中占用的字節(jié)數(shù)根據(jù)對(duì)應(yīng)的類(lèi)型或長(zhǎng)度確定。
[0020]客戶端根據(jù)對(duì)應(yīng)的所述解析配置對(duì)所述協(xié)議串進(jìn)行解析,包括:
[0021]按照所述解析配置中各信息元的排列順序、以及各信息元的內(nèi)容對(duì)協(xié)議串進(jìn)行解析,依次得到各信息元對(duì)應(yīng)的數(shù)據(jù)元素的值。
[0022]數(shù)據(jù)元素為基本類(lèi)型數(shù)據(jù)時(shí),對(duì)應(yīng)的信息元的內(nèi)容包括:類(lèi)型和屬性名;
[0023]所述基本類(lèi)型數(shù)據(jù)的至少包括以下幾種:字符型、字符串、整型、布爾型(bool)。
[0024]數(shù)據(jù)元素為基本類(lèi)型數(shù)據(jù)時(shí),對(duì)應(yīng)的信息元的內(nèi)容還包括:長(zhǎng)度。
[0025]數(shù)據(jù)元素為數(shù)組時(shí),對(duì)應(yīng)的信息元的內(nèi)容包括:類(lèi)型、屬性名、成員的類(lèi)型和長(zhǎng)度;
[0026]所述數(shù)組包含一個(gè)或多個(gè)成員,所有成員為類(lèi)型相同的基本類(lèi)型數(shù)據(jù);
[0027]長(zhǎng)度指示成員的個(gè)數(shù),通過(guò)解析得到的前一個(gè)數(shù)據(jù)元素的值指定,且前一個(gè)數(shù)據(jù)元素為基本類(lèi)型數(shù)據(jù)。。
[0028]數(shù)據(jù)元素為對(duì)象時(shí),對(duì)應(yīng)的信息元的內(nèi)容包括:類(lèi)型、屬性名、子對(duì)象的解析配置和長(zhǎng)度;
[0029]所述對(duì)象包含一個(gè)或多個(gè)子對(duì)象,每個(gè)子對(duì)象中包含一個(gè)或多個(gè)成員,一個(gè)成員為一個(gè)基本類(lèi)型數(shù)據(jù)或一個(gè)數(shù)組,且各子對(duì)象中排列序號(hào)相同的成員的類(lèi)型和屬性名相同;
[0030]長(zhǎng)度指示子對(duì)象的個(gè)數(shù),通過(guò)解析得到的前一個(gè)數(shù)據(jù)元素的值指定,且前一個(gè)數(shù)據(jù)元素為基本類(lèi)型數(shù)據(jù)。
[0031]子對(duì)象中的成員為基本類(lèi)型數(shù)據(jù)時(shí),在所述子對(duì)象的解析配置中對(duì)應(yīng)的子信息元的內(nèi)容為權(quán)利要求6或7所述的信息元的內(nèi)容;
[0032]子對(duì)象中的成員為數(shù)組時(shí),在所述子對(duì)象的解析配置中對(duì)應(yīng)的子信息元的內(nèi)容為權(quán)利要求8所述的信息元的內(nèi)容。
[0033]本發(fā)明還提供了一種封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的系統(tǒng),設(shè)置模塊、服務(wù)端和客戶端,其中:
[0034]所述設(shè)置模塊,用于根據(jù)二進(jìn)制協(xié)議數(shù)據(jù)的結(jié)構(gòu)化數(shù)據(jù)設(shè)置對(duì)應(yīng)的封裝配置和解析配置;
[0035]所述服務(wù)端,用于預(yù)先保存封裝配置,并根據(jù)所述封裝配置對(duì)二進(jìn)制協(xié)議數(shù)據(jù)的結(jié)構(gòu)化數(shù)據(jù)進(jìn)行封裝,得到協(xié)議串,發(fā)送給所述客戶端;
[0036]所述客戶端,用于預(yù)先保存解析配置,并根據(jù)對(duì)應(yīng)的所述解析配置對(duì)接收所述協(xié)議串進(jìn)行解析,得到所述結(jié)構(gòu)化數(shù)據(jù)。
[0037]所述服務(wù)端,還用于將結(jié)構(gòu)化數(shù)據(jù)的各數(shù)據(jù)元素的值按照各數(shù)據(jù)元素在結(jié)構(gòu)化數(shù)據(jù)中的排列順序依次封裝到協(xié)議串中;各數(shù)據(jù)元素的值在協(xié)議串中占用的字節(jié)數(shù)根據(jù)對(duì)應(yīng)的類(lèi)型或長(zhǎng)度確定。
[0038]所述客戶端,還用于按照所述解析配置中各信息元的排列順序、以及各信息元的內(nèi)容對(duì)協(xié)議串進(jìn)行解析,依次得到各信息元對(duì)應(yīng)的數(shù)據(jù)元素的值。
[0039]本發(fā)明封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的方法和裝置,將封裝配置和解析配置均預(yù)先在服務(wù)端和客戶端保存,因此在傳遞過(guò)程中,只需要傳遞接口本身的數(shù)據(jù)、即結(jié)構(gòu)化數(shù)據(jù)即可,這樣大大減小了協(xié)議的體積。
[0040]由于預(yù)先對(duì)接口設(shè)置了封裝配置和解析配置,則在傳遞接口的結(jié)構(gòu)化數(shù)據(jù)時(shí),不需要服務(wù)端按照某種特定的協(xié)議來(lái)封裝,客戶端也不需要按照某種特定的協(xié)議來(lái)解析,不管該接口是在何種語(yǔ)言、何種系統(tǒng)中使用,只需要按照預(yù)先配置的封裝配置封裝對(duì)應(yīng)版本的接口的結(jié)構(gòu)化數(shù)據(jù)即可,而客戶端也只需要按照預(yù)先配置的解析配置文件進(jìn)行解析,即可得到對(duì)應(yīng)版本的結(jié)構(gòu)化數(shù)據(jù)。之后,客戶端可以直接運(yùn)行該版本的接口。另外,因?yàn)槊總€(gè)接口的結(jié)構(gòu)化數(shù)據(jù)的不同,上述的封裝配置和解析配置只是在接口間有差異,在本接口中,該封裝配置和解析配置適用于各種版本(例如C++版本、Java版本、PHP版本、Python版本等)。雖然各接口間的封裝配置和解析配置的具體內(nèi)容不同,但是,封裝配置和解析配置所指示的封裝方式和解析方式相同。因此,實(shí)現(xiàn)和維護(hù)比較簡(jiǎn)單,大大降低了成本。
【專利附圖】
【附圖說(shuō)明】
[0041]圖1為傳統(tǒng)的二進(jìn)制協(xié)議實(shí)現(xiàn)方式示意圖;
[0042]圖2為統(tǒng)一的通用協(xié)議的二進(jìn)制協(xié)議實(shí)現(xiàn)方式示意圖;
[0043]圖3為本發(fā)明實(shí)施例提供的二進(jìn)制協(xié)議實(shí)現(xiàn)方式示意圖;
[0044]圖4為本發(fā)明實(shí)施例封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的方法流程示意圖。
【具體實(shí)施方式】
[0045]本發(fā)明封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的方案的基本思想如圖3所示,針對(duì)每種二進(jìn)制協(xié)議(也可稱為接口),設(shè)置封裝配置和解析配置,服務(wù)端按照封裝配置指示的封裝方式將該接口的結(jié)構(gòu)化數(shù)據(jù)封裝為協(xié)議串;客戶端接收到協(xié)議串后,按照解析配置指示的解析方式進(jìn)行解析后得到結(jié)構(gòu)化數(shù)據(jù)。
[0046]如圖4所示,本發(fā)明實(shí)施例提供的封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的方法,包括:
[0047]步驟401,服務(wù)端預(yù)先保存封裝配置,客戶端預(yù)先保存解析配置。
[0048]本發(fā)明中,需要根據(jù)二進(jìn)制協(xié)議數(shù)據(jù)的結(jié)構(gòu)化數(shù)據(jù)設(shè)置對(duì)應(yīng)的封裝配置和解析配置,然后,由服務(wù)端預(yù)先保存封裝配置,客戶端預(yù)先保存解析配置。
[0049]其中,接口的結(jié)構(gòu)化數(shù)據(jù)即為該接口本身的數(shù)據(jù),其可以用二維表結(jié)構(gòu)表示,因此稱之為結(jié)構(gòu)化數(shù)據(jù)。接口的結(jié)構(gòu)化數(shù)據(jù)包括一個(gè)或多個(gè)數(shù)據(jù)元素,其中,每個(gè)數(shù)據(jù)元素包含的項(xiàng)目有:類(lèi)型、屬性名和值;進(jìn)一步地,數(shù)據(jù)元素中還可以包括的項(xiàng)固有長(zhǎng)度。
[0050]在本接口中,封裝配置和解析配置適用于各種版本(例如C++版本、Java版本、PHP版本、Python版本等)。但是,接口間的封裝配置和解析配置的具體內(nèi)容因接口結(jié)構(gòu)化數(shù)據(jù)的不同而不同,但是,相同類(lèi)型的結(jié)構(gòu)化數(shù)據(jù)對(duì)應(yīng)的封裝配置和解析配置所指示的封裝方式和解析方式所遵循的規(guī)則相同。為此,可以將接口的結(jié)構(gòu)化數(shù)據(jù)至少分為:基本類(lèi)型數(shù)據(jù)、數(shù)組和對(duì)象。
[0051]其中,
[0052]步驟402,服務(wù)端根據(jù)封裝配置對(duì)二進(jìn)制協(xié)議數(shù)據(jù)的結(jié)構(gòu)化數(shù)據(jù)進(jìn)行封裝,得到協(xié)議串。
[0053]具體的,服務(wù)端將結(jié)構(gòu)化數(shù)據(jù)的各數(shù)據(jù)元素的值按照各數(shù)據(jù)元素在結(jié)構(gòu)化數(shù)據(jù)中的排列順序依次封裝到協(xié)議串中;
[0054]各數(shù)據(jù)元素的值在協(xié)議串中占用的字節(jié)數(shù)根據(jù)對(duì)應(yīng)的類(lèi)型或長(zhǎng)度確定。
[0055]步驟403,客戶端根據(jù)對(duì)應(yīng)的解析配置對(duì)協(xié)議串進(jìn)行解析,得到結(jié)構(gòu)化數(shù)據(jù)。
[0056]解析時(shí),按照解析配置中各信息元的排列順序、以及各信息元的內(nèi)容對(duì)協(xié)議串進(jìn)行解析,依次得到各信息元對(duì)應(yīng)的數(shù)據(jù)元素的值。
[0057]最后,將數(shù)據(jù)元素按照解析出的順序依次填入二維表中,得到結(jié)構(gòu)化數(shù)據(jù)。
[0058]上述具體的解析和封裝過(guò)程將通過(guò)一下的實(shí)施例進(jìn)行說(shuō)明。
.[0059]實(shí)施例一、基本類(lèi)型數(shù)據(jù)的封裝和解析。
[0060]本發(fā)明中,基本類(lèi)型數(shù)據(jù)至少包括以下幾種類(lèi)型:字符型、字符串、整型、布爾型(bool)。
[0061]如表I所示為接口的結(jié)構(gòu)化數(shù)據(jù),其中包含三個(gè)數(shù)據(jù)元素,這三個(gè)數(shù)據(jù)元素都屬于基本類(lèi)型數(shù)據(jù):第I個(gè)數(shù)據(jù)元素的類(lèi)型為uints、屬性名為a、值為8 ;第2個(gè)數(shù)據(jù)元素的類(lèi)型為uint32、屬性名為b、值為5 ;第3個(gè)數(shù)據(jù)元素的類(lèi)型為string、屬性名為C、值為Hello、長(zhǎng)度為5個(gè)字節(jié)。
[0062]
uint8 a 8
uint32 b 5
string c Hello 5
[0063]表I
[0064]一、封裝過(guò)程。
[0065]服務(wù)端將該結(jié)構(gòu)化數(shù)據(jù)的各數(shù)據(jù)元素的值按照各數(shù)據(jù)元素在結(jié)構(gòu)化數(shù)據(jù)中的排列順序依次封裝到協(xié)議串中,如表2所示。
[0066]
|8 I I I ISlHleil 11 I ο |
[0067]表2
[0068]其中,在協(xié)議串中各數(shù)據(jù)元素的值占用的字節(jié)數(shù)通過(guò)該數(shù)據(jù)元素的類(lèi)型確定或者直接通過(guò)該數(shù)據(jù)元素的長(zhǎng)度確定。例如,UintS指示第I個(gè)數(shù)據(jù)元素占用I個(gè)字節(jié)、uint32指示第2個(gè)數(shù)據(jù)元素占用4個(gè)字節(jié);第3個(gè)數(shù)據(jù)元素占用的字節(jié)數(shù)已經(jīng)直接給出,即為5個(gè)字節(jié)。
[0069]二、解析過(guò)程。
[0070]客戶端接收到如表2所示的協(xié)議串后,通過(guò)該協(xié)議串的包頭(表2所示的協(xié)議串忽略了包頭部分)可以獲知其對(duì)應(yīng)的接口,然后查找該接口對(duì)應(yīng)的解析配置,按照該解析配置對(duì)協(xié)議串進(jìn)行解析。
[0071]具體的,該解析配置包含的信息元有:
[0072]【uint8,‘a(chǎn)’】(協(xié)議串的第I個(gè)數(shù)據(jù)元素的類(lèi)型為uint8、屬性名為a);
[0073][uint32, ‘b’】(協(xié)議串的第2個(gè)數(shù)據(jù)元素的類(lèi)型為uint32、屬性名為b);
[0074]【string,‘c’,5】(協(xié)議串的第3個(gè)數(shù)據(jù)元素的類(lèi)型為string、屬性名為C、長(zhǎng)度為5(字節(jié)))。
[0075]由此可見(jiàn),基本類(lèi)型數(shù)據(jù)對(duì)應(yīng)的信息元的內(nèi)容包括:類(lèi)型和屬性名,進(jìn)一步地,還可以包括長(zhǎng)度。
[0076]解析時(shí),按照解析配置中信息元的排列順序、以及各信息元的內(nèi)容對(duì)協(xié)議串依次進(jìn)行解析,得到各信息元對(duì)應(yīng)的數(shù)據(jù)元素的值。
[0077]根據(jù)UintS可以確定第I個(gè)數(shù)據(jù)元素占用I個(gè)字節(jié),則從表2所示的協(xié)議串中取出的第I個(gè)字節(jié)的值為8,根據(jù)解析配置可知,其對(duì)應(yīng)的屬性名為a ;
[0078]根據(jù)uint32可以確定第2個(gè)數(shù)據(jù)元素占用4個(gè)字節(jié),則從表2所示的協(xié)議串中取出的第2、3、4、5個(gè)字節(jié)的值為5,根據(jù)解析配置可知,其對(duì)應(yīng)的屬性名為b ;
[0079]根據(jù)長(zhǎng)度為5確定第三次取出的元素為5個(gè)字節(jié),則從表2所示的協(xié)議串中取出的第6-10個(gè)字節(jié)的值為Hello,根據(jù)解析配置可知,其對(duì)應(yīng)的屬性名為C。
[0080]按照解析出的順序,將各數(shù)據(jù)元素(包括類(lèi)型、值和屬性名,如果存在還包括長(zhǎng)度)填入一個(gè)二維表中,即可得到如表I所示的該接口的結(jié)構(gòu)化數(shù)據(jù)。
[0081]通過(guò)上述的封裝和解析過(guò)程可知,由于封裝配置和解析配置均預(yù)先在服務(wù)端和客戶端保存了,因此在傳遞過(guò)程中,只需要傳遞接口本身的數(shù)據(jù)、即結(jié)構(gòu)化數(shù)據(jù)即可,這樣大大減小了協(xié)議的體積。
[0082]由于預(yù)先對(duì)接口設(shè)置了封裝配置和解析配置,則在傳遞接口的結(jié)構(gòu)化數(shù)據(jù)時(shí),不需要服務(wù)端按照某種特定的協(xié)議來(lái)封裝,客戶端也不需要按照某種特定的協(xié)議來(lái)解析,不管該接口是在何種語(yǔ)言、何種系統(tǒng)中使用,只需要按照預(yù)先配置的封裝配置封裝對(duì)應(yīng)版本的接口的結(jié)構(gòu)化數(shù)據(jù)即可,而客戶端也只需要按照預(yù)先配置的解析配置文件進(jìn)行解析,即可得到對(duì)應(yīng)版本的結(jié)構(gòu)化數(shù)據(jù)。之后,客戶端可以直接運(yùn)行該版本的接口。另外,因?yàn)槊總€(gè)接口的結(jié)構(gòu)化數(shù)據(jù)的不同,上述的封裝配置和解析配置只是在接口間有差異,在本接口中,該封裝配置和解析配置適用于各種版本(例如C++版本、Java版本、PHP版本、Python版本等)。雖然各接口間的封裝配置和解析配置的具體內(nèi)容不同,但是,封裝配置和解析配置所指示的封裝方式和解析方式相同。因此,實(shí)現(xiàn)和維護(hù)比較簡(jiǎn)單,大大降低了成本。
[0083]實(shí)施例二、數(shù)組的封裝和解析。
[0084]數(shù)組包含一個(gè)或多個(gè)成員,所有成員為類(lèi)型相同的基本類(lèi)型數(shù)據(jù)。如表3所示為接口的結(jié)構(gòu)化數(shù)據(jù),該結(jié)構(gòu)化數(shù)據(jù)的第2個(gè)數(shù)據(jù)元素為array (數(shù)組)。數(shù)組的長(zhǎng)度、即成員的個(gè)數(shù)通過(guò)前一個(gè)數(shù)據(jù)元素的值指定,且前一個(gè)數(shù)據(jù)元素為基本類(lèi)型數(shù)據(jù)。
[0085]如表3所示,該結(jié)構(gòu)化數(shù)據(jù)包括兩個(gè)數(shù)據(jù)元素:第I個(gè)數(shù)據(jù)元素為基本類(lèi)型數(shù)據(jù),其類(lèi)型為uint8、屬性名為length、值為6 ;第2個(gè)數(shù)據(jù)元素為數(shù)組,其類(lèi)型為array,屬性名為list,值由6個(gè)成員組成(這6個(gè)成員的類(lèi)型為uintl6,值分別為5、0、1、9、59、3)。[0086]
【權(quán)利要求】
1.一種封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的方法,其特征在于,根據(jù)二進(jìn)制協(xié)議數(shù)據(jù)的結(jié)構(gòu)化數(shù)據(jù)設(shè)置對(duì)應(yīng)的封裝配置和解析配置,該方法還包括: 服務(wù)端預(yù)先保存封裝配置,客戶端預(yù)先保存解析配置; 服務(wù)端根據(jù)所述封裝配置對(duì)二進(jìn)制協(xié)議數(shù)據(jù)的結(jié)構(gòu)化數(shù)據(jù)進(jìn)行封裝,得到協(xié)議串; 客戶端根據(jù)對(duì)應(yīng)的所述解析配置對(duì)所述協(xié)議串進(jìn)行解析,得到所述結(jié)構(gòu)化數(shù)據(jù)。
2.根據(jù)權(quán)利要求1所述封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的方法,其特征在于,所述結(jié)構(gòu)化數(shù)據(jù)包括一個(gè)或多個(gè)數(shù)據(jù)元素;所述數(shù)據(jù)元素包括:類(lèi)型、屬性名和值。
3.根據(jù)權(quán)利要求2所述封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的方法,其特征在于,所述數(shù)據(jù)元素還包括長(zhǎng)度。
4.根據(jù)權(quán)利要求3所述封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的方法,其特征在于,所述服務(wù)端根據(jù)所述封裝配置對(duì)二進(jìn)制協(xié)議數(shù)據(jù)的結(jié)構(gòu)化數(shù)據(jù)進(jìn)行封裝,包括: 服務(wù)端將結(jié)構(gòu)化數(shù)據(jù)的各數(shù)據(jù)元素的值按照各數(shù)據(jù)元素在結(jié)構(gòu)化數(shù)據(jù)中的排列順序依次封裝到協(xié)議串中; 各數(shù)據(jù)元素的值在協(xié)議串中占用的字節(jié)數(shù)根據(jù)對(duì)應(yīng)的類(lèi)型或長(zhǎng)度確定。
5.根據(jù)權(quán)利要求4所述封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的方法,其特征在于,客戶端根據(jù)對(duì)應(yīng)的所述解析配置對(duì)所述協(xié)議串進(jìn)行解析,包括: 按照所述解析配置中各信息元的排列順序、以及各信息元的內(nèi)容對(duì)協(xié)議串進(jìn)行解析,依次得到各信息元對(duì)應(yīng)的數(shù)據(jù)元 素的值。
6.根據(jù)權(quán)利要求5所述封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的方法,其特征在于, 數(shù)據(jù)元素為基本類(lèi)型數(shù)據(jù)時(shí),對(duì)應(yīng)的信息元的內(nèi)容包括:類(lèi)型和屬性名; 所述基本類(lèi)型數(shù)據(jù)的至少包括以下幾種:字符型、字符串、整型、布爾型(bool)。
7.根據(jù)權(quán)利要求6所述封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的方法,其特征在于, 數(shù)據(jù)元素為基本類(lèi)型數(shù)據(jù)時(shí),對(duì)應(yīng)的信息元的內(nèi)容還包括:長(zhǎng)度。
8.根據(jù)權(quán)利要求5所述封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的方法,其特征在于, 數(shù)據(jù)元素為數(shù)組時(shí),對(duì)應(yīng)的信息元的內(nèi)容包括:類(lèi)型、屬性名、成員的類(lèi)型和長(zhǎng)度; 所述數(shù)組包含一個(gè)或多個(gè)成員,所有成員為類(lèi)型相同的基本類(lèi)型數(shù)據(jù); 長(zhǎng)度指示成員的個(gè)數(shù),通過(guò)解析得到的前一個(gè)數(shù)據(jù)元素的值指定,且前一個(gè)數(shù)據(jù)元素為基本類(lèi)型數(shù)據(jù)。
9.根據(jù)權(quán)利要求5所述封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的方法,其特征在于, 數(shù)據(jù)元素為對(duì)象時(shí),對(duì)應(yīng)的信息元的內(nèi)容包括:類(lèi)型、屬性名、子對(duì)象的解析配置和長(zhǎng)度; 所述對(duì)象包含一個(gè)或多個(gè)子對(duì)象,每個(gè)子對(duì)象中包含一個(gè)或多個(gè)成員,一個(gè)成員為一個(gè)基本類(lèi)型數(shù)據(jù)或一個(gè)數(shù)組,且各子對(duì)象中排列序號(hào)相同的成員的類(lèi)型和屬性名相同;長(zhǎng)度指示子對(duì)象的個(gè)數(shù),通過(guò)解析得到的前一個(gè)數(shù)據(jù)元素的值指定,且前一個(gè)數(shù)據(jù)元素為基本類(lèi)型數(shù)據(jù)。
10.根據(jù)權(quán)利要求9所述封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的方法,其特征在于, 子對(duì)象中的成員為基本類(lèi)型數(shù)據(jù)時(shí),在所述子對(duì)象的解析配置中對(duì)應(yīng)的子信息元的內(nèi)容為權(quán)利要求6或7所述的信息元的內(nèi)容; 子對(duì)象中的成員為數(shù)組時(shí),在所述子對(duì)象的解析配置中對(duì)應(yīng)的子信息元的內(nèi)容為權(quán)利要求8所述的信息元的內(nèi)容。
11.一種封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的系統(tǒng),其特征在于,設(shè)置模塊、服務(wù)端和客戶端,其中: 所述設(shè)置模塊,用于根據(jù)二進(jìn)制協(xié)議數(shù)據(jù)的結(jié)構(gòu)化數(shù)據(jù)設(shè)置對(duì)應(yīng)的封裝配置和解析配置; 所述服務(wù)端,用于預(yù)先保存封裝配置,并根據(jù)所述封裝配置對(duì)二進(jìn)制協(xié)議數(shù)據(jù)的結(jié)構(gòu)化數(shù)據(jù)進(jìn)行封裝,得到協(xié)議串,發(fā)送給所述客戶端; 所述客戶端,用于預(yù)先保存解析配置,并根據(jù)對(duì)應(yīng)的所述解析配置對(duì)接收所述協(xié)議串進(jìn)行解析,得到所述結(jié)構(gòu)化數(shù)據(jù)。
12.根據(jù)權(quán)利要求11所述封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的系統(tǒng),其特征在于, 所述服務(wù)端,還用于將結(jié)構(gòu)化數(shù)據(jù)的各數(shù)據(jù)元素的值按照各數(shù)據(jù)元素在結(jié)構(gòu)化數(shù)據(jù)中的排列順序依次封裝到協(xié)議串中;各數(shù)據(jù)元素的值在協(xié)議串中占用的字節(jié)數(shù)根據(jù)對(duì)應(yīng)的類(lèi)型或長(zhǎng)度確定。
13.根據(jù)權(quán)利要求11所述封裝與解析二進(jìn)制協(xié)議數(shù)據(jù)的系統(tǒng),其特征在于, 所述客戶端,還用于按照所述解析配置中各信息元的排列順序、以及各信息元的內(nèi)容對(duì)協(xié)議串進(jìn)行解析, 依次得到各信息元對(duì)應(yīng)的數(shù)據(jù)元素的值。
【文檔編號(hào)】H04L29/06GK103428192SQ201210172699
【公開(kāi)日】2013年12月4日 申請(qǐng)日期:2012年5月25日 優(yōu)先權(quán)日:2012年5月25日
【發(fā)明者】楊建禹 申請(qǐng)人:騰訊科技(北京)有限公司