摘要:本文提供一種結(jié)構(gòu)化數(shù)據(jù)交換格式及方法,數(shù)據(jù)交換包的結(jié)構(gòu)主要由數(shù)據(jù)項值對與數(shù)據(jù)記錄集兩種結(jié)構(gòu)組成,能很簡明地描述數(shù)據(jù),并使用特殊的不可輸入分隔符將數(shù)據(jù)項分開,包含數(shù)據(jù)項值對與數(shù)據(jù)記錄集的格式實現(xiàn),只增加了很少的冗余數(shù)據(jù),序列化編碼、解碼的方法簡單,體積小,編碼的效率較高,能支持文本和二進制數(shù)據(jù),可直接閱讀。與XML、JSON等格式相比,有數(shù)據(jù)包小、數(shù)據(jù)交換速度快、應用方便等特點,可以把它用在C/S/S架構(gòu)、B/S/S架構(gòu)或分布式應用之間的數(shù)據(jù)通信,異構(gòu)環(huán)境下的數(shù)據(jù)交換也適用。
關(guān)鍵詞:XML JSON 結(jié)構(gòu)化數(shù)據(jù)交換
1 技術(shù)背景
隨著計算機技術(shù)的發(fā)展,計算機網(wǎng)絡的應用無處不在,應用軟件的架構(gòu)也已脫離桌面式單機時代,發(fā)展到C/S(客戶/服務架構(gòu))、C/S/S(客戶/中間件應用服務/數(shù)據(jù)庫服務)、B/S/S(瀏覽器客戶/Web應用服務/數(shù)據(jù)庫服務)和分布式多層異構(gòu)平臺。這些結(jié)構(gòu)都能實現(xiàn)多客戶端、多并發(fā)和大型數(shù)據(jù)訪問的軟件管理信息系統(tǒng),大大提高了信息流通的速度和效率,吸引了越來越多的企業(yè)、個人通過網(wǎng)絡從事其相關(guān)活動,基于網(wǎng)絡的數(shù)據(jù)交換和業(yè)務協(xié)作越來越頻繁。
數(shù)據(jù)交換的協(xié)議主要是基于TCP/IP、HTTP等底層協(xié)議,數(shù)據(jù)的訪問方法不同架構(gòu)有不同的方式:
C/S主要使用數(shù)據(jù)庫服務器專有協(xié)議和數(shù)據(jù)格式,使用如SQL(結(jié)構(gòu)化查詢語言)等方法,利用客戶端的開發(fā)工具(如PowerBuilder,Delphi,Vb等)實現(xiàn)數(shù)據(jù)的訪問。
C/S/S架構(gòu)客戶端使用與中間件應用服務器的專有協(xié)議訪問,如Oracle Bea Tuxedo使用簡單的字串到復雜的FML等多種交換方式實現(xiàn)客戶端與中間件的數(shù)據(jù)交換。中間件與數(shù)據(jù)庫的訪問同C/S架構(gòu)。
B/S/S是基于瀏覽器瘦客戶端,使用HTTP協(xié)議與WEB服務器交互,在文本交互方式的基礎(chǔ)上發(fā)展出如XML、JSON等開放的交換格式。
當前流行的數(shù)據(jù)交換格式和方案主要有XML、JSON和Google的Protocol buffer等。
XML:以文本格式描述數(shù)據(jù)的標記語言,缺點是用XML描述的數(shù)據(jù)比原始數(shù)據(jù)大很多,而且數(shù)據(jù)訪問解析比較慢,格式復雜,傳輸占用帶寬。服務器端和客戶端都需要花費大量代碼來解析XML,不論服務器端和客戶端代碼變的異常復雜和不容易維護,客戶端不同瀏覽器之間解析XML的方式不一致,需要重復編寫很多代碼,服務器端和客戶端解析XML花費資源和時間都較多。
JSON:(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式,它基于JavaScript Programming Language,相對于XML,它更加易讀。但JSON中的分隔符只限于單引號、小括號、中括號、大括號、冒號和逗號等可輸入字符,若數(shù)據(jù)內(nèi)容中本身包含這些字符時,要做轉(zhuǎn)移處理,會增加解析的復雜度,且對于其它語言編碼解碼相對復雜。
Protocol buffer:是Google公司開源的結(jié)構(gòu)化數(shù)據(jù)格式,功能類似XML,但結(jié)構(gòu)復雜,編碼與解碼API比較復雜,編碼過程需要專門的編譯步驟,壓縮的二進制格式,無法直接閱讀。
2 一種結(jié)構(gòu)化數(shù)據(jù)交換格式及方法
本文提供一種結(jié)構(gòu)化數(shù)據(jù)交換格式及方法,數(shù)據(jù)交換包的結(jié)構(gòu)主要由數(shù)據(jù)項值對與數(shù)據(jù)記錄集兩種結(jié)構(gòu)組成,能很簡明地描述數(shù)據(jù),并使用特殊的不可輸入分隔符將數(shù)據(jù)項分開,包含數(shù)據(jù)項值對與數(shù)據(jù)記錄集的格式實現(xiàn),只增加了很少的冗余數(shù)據(jù),序列化編碼、解碼的方法簡單,體積小,編碼的效率較高,能支持文本和二進制數(shù)據(jù),可直接閱讀。與XML、JSON等格式相比,有數(shù)據(jù)包小、數(shù)據(jù)交換速度快、應用方便等特點,可以把它用在C/S/S架構(gòu)、B/S/S架構(gòu)或分布式應用之間的數(shù)據(jù)通信,異構(gòu)環(huán)境下的數(shù)據(jù)交換也適用。如圖1
結(jié)構(gòu)化數(shù)據(jù)交換格式由兩大數(shù)據(jù)區(qū)組成,一是數(shù)據(jù)項值對區(qū),另一個是數(shù)據(jù)記錄集內(nèi)容區(qū),數(shù)據(jù)項值對也可以理解為數(shù)據(jù)域,由數(shù)據(jù)項的名稱和數(shù)據(jù)項的內(nèi)容組成,這類數(shù)據(jù)項通常在軟件開發(fā)中簡稱為“值對”,值對的優(yōu)點是在數(shù)據(jù)交換中每個數(shù)據(jù)項可以用唯一的名稱標識出來,在數(shù)據(jù)交換解析時可以用名稱直接取得該數(shù)據(jù)項的內(nèi)容,可以提高解析速度,本文描述的結(jié)構(gòu)中數(shù)據(jù)項值對以最小的冗余來描述,如圖2所示:
數(shù)據(jù)項名稱與數(shù)據(jù)項內(nèi)容之間用不可輸入的字符分隔,該字符為ASCII碼為1的鍵盤不可輸入字符,數(shù)據(jù)項的內(nèi)容中不易包含這類字符。數(shù)據(jù)項值對區(qū)由若干個數(shù)據(jù)項組成,本文描述提供的格式將不同的數(shù)據(jù)項之間由ASCII碼為2的字符分隔。數(shù)據(jù)項值對區(qū)結(jié)束由ASCII碼為6的字符表示。
數(shù)據(jù)項值對主要表達一維的數(shù)據(jù),數(shù)據(jù)交換中還需要表達二維結(jié)構(gòu)的數(shù)據(jù),通常稱為數(shù)據(jù)記錄集,本文描述提供的格式將記錄集的描述進行了優(yōu)化,同一個數(shù)據(jù)包中可包含一個以上的記錄集,每個記錄集有唯一的名稱,并將每個記錄集的屬性(主要有記錄集的名稱、記錄數(shù)和列名)以數(shù)據(jù)項值對形式放入了數(shù)據(jù)項值對區(qū)中,解析數(shù)據(jù)時可用名稱取得記錄集,并通過屬性項可以取得記錄集記錄數(shù)和記錄集的各列名稱,大大提高記錄集的解析速度。
數(shù)據(jù)記錄集的名稱屬性設計為一個特殊的數(shù)據(jù)項值對,該數(shù)據(jù)項值對的名稱為數(shù)據(jù)記錄集的名稱,該數(shù)據(jù)項值對的內(nèi)容為一固定的記錄集標識符:[$],由美元符號和一對中括號組成。
數(shù)據(jù)記錄集的記錄數(shù)屬性由編碼時放入,該項的名稱為:“數(shù)據(jù)記錄集的名稱.rows”,該項的值為記錄數(shù)。
數(shù)據(jù)記錄集的各列號由一數(shù)據(jù)項表示,該項的名稱為:“數(shù)據(jù)記錄集的名稱.cols”,該項的內(nèi)容是由各列名稱和ASCII碼為4的列分隔符組成,參見圖3:
數(shù)據(jù)記錄集內(nèi)容區(qū)如圖4:
由若干個記錄集內(nèi)容組成,每個記錄集的內(nèi)容格式由名稱、行數(shù)據(jù)和結(jié)束符組成,記錄集內(nèi)容開始處的名稱由三部分組成,一是標識起始符,由ASCII碼為3的字符和‘<’字符總共2個字符組成,第二部分是記錄集名稱,第三部分為標識結(jié)束符,由字符‘>’和ASCII碼為3的字符組成,行數(shù)據(jù)由每行數(shù)據(jù)組成,行與行之間由ASCII碼為5的字符分隔,行數(shù)據(jù)由數(shù)據(jù)集的各列加上ASCII碼為4的列分隔符組成,記錄集內(nèi)容結(jié)束符與數(shù)據(jù)項值對區(qū)結(jié)束符相對,為ASCII碼為6的字符,數(shù)據(jù)記錄集內(nèi)容區(qū)中的多個記錄集依次存放。
結(jié)構(gòu)化數(shù)據(jù)交換格式(全局示意圖)如圖5:
3 結(jié)構(gòu)化編碼方法
本文描述的結(jié)構(gòu)化交換格式在編碼時相對簡易,與計算機語言無關(guān),當前主流的語言與平臺都能實現(xiàn),本文以Java語言的方式描述編碼的實施方式。
結(jié)構(gòu)化數(shù)據(jù)交換格式編碼主要由以下關(guān)鍵步驟
3.1 分配數(shù)據(jù)交換的空間,開辟一個數(shù)據(jù)項值對區(qū)和一個數(shù)據(jù)記錄集內(nèi)容區(qū),如在Java中申明兩個String Buffer變量buf1和buf2。
3.2 寫入數(shù)據(jù)項值對,先寫入數(shù)據(jù)項的名稱,若該數(shù)據(jù)項的名稱為‘name1’,則buf1.append(‘name1’),依次寫入數(shù)據(jù)項名稱與內(nèi)容的分隔符buf1.append(char(1)),再將數(shù)據(jù)項的內(nèi)容寫入,如buf1.append(‘name1_value’),最后寫入與下一個數(shù)據(jù)項的分隔符buf1.append(char(2)),一個完整的數(shù)據(jù)項編碼過程結(jié)束。
3.3 若有多個數(shù)據(jù)項,按步驟2的方法依次寫入,所有的數(shù)據(jù)項寫完后,最后寫入數(shù)據(jù)項值對區(qū)的區(qū)結(jié)束符 buf1.append(char(6)),若本次編碼中有記錄集,應將記錄集的屬性數(shù)據(jù)項寫入到數(shù)據(jù)項區(qū)后才能寫入?yún)^(qū)結(jié)束符。
3.4 若有記錄集,寫入數(shù)據(jù)記錄集時,先將記錄集名稱按步驟2寫入,內(nèi)容為”[$]”,buf2.append(“記錄集1 [$]”)。
3.5 完成步驟4后,將記錄集的記錄數(shù)按步驟2寫入,名稱為:記錄集名稱.rows ,內(nèi)容為記錄數(shù),如Java的list取記錄數(shù)為list名.size(),buf2.append(“記錄集1.rows 1000”)。
3.6 將記錄集的各列列名稱按步驟2寫入,名稱為:記錄集名稱.cols,內(nèi)容是各列列名用ASCII碼為4的字符分隔,分隔字符個數(shù)為記錄集的列數(shù)減一,兩端無分隔符,buf2.append(“記錄集1.cols c1 c2 c3”)。
3.7 寫記錄集的內(nèi)容,在數(shù)據(jù)記錄集內(nèi)容區(qū) buf2中,首先寫入記錄集標識起始符,為兩個字符,第一個是ASCII碼為3的字符,第二個為”<”,buf2.append(char(3)),buf2.append(“<”)。
3.8 在數(shù)據(jù)記錄集內(nèi)容區(qū) buf2中寫入記錄集的名稱,buf2.append(“記錄集1”)。
3.9 依次寫入記錄集標識結(jié)束符,與起始符對應為兩個字符,第一個是“>”,第二個是ASCII碼為3的字符,buf2.append(“>”),buf2.append(char(3))。
3.10 寫入數(shù)據(jù)記錄集的行數(shù)據(jù),從記錄集的第一行開始,依次寫入,每一行的規(guī)則是:按列的順序(順序與記錄集的各列名屬性順序一致),寫入各列的內(nèi)容,列之間用ASCII碼為4的字符分隔,最后一列后續(xù)不用些分隔,一行結(jié)束后寫入行結(jié)束符(ASCII 碼為5的字符),完成記錄集所有行的數(shù)據(jù)后,寫入記錄集數(shù)據(jù)區(qū)結(jié)束符(ASCII碼為6的字符)。
3.11 若有多個數(shù)據(jù)記錄集,按步驟4至步驟10方法寫入。
3.12 結(jié)構(gòu)化數(shù)據(jù)交換格式解析主要由以下關(guān)鍵步驟:
對本文描述提供的結(jié)構(gòu)化數(shù)據(jù)交換格式解析時,主要實現(xiàn)以下幾大解析功能:
①通過名稱取得指定數(shù)據(jù)項的內(nèi)容。
②取得所有數(shù)據(jù)項名稱的列表或數(shù)組。
③通過名稱取得指定數(shù)據(jù)記錄集的游標句柄(或指針)。
④實現(xiàn)記錄集游標遍歷(單向或雙向)。
⑤通過列名稱取得當前記錄集游標所在行指定列的內(nèi)容。
⑥通過列索引編號取得當前記錄集游標所在行指定列的內(nèi)容。
4 結(jié)束語
對本文描述一種結(jié)構(gòu)化數(shù)據(jù)交換格式,有一定的實用意義,能很簡明地描述數(shù)據(jù),并使用特殊的不可輸入分隔符將數(shù)據(jù)項分開,包含數(shù)據(jù)項值對與數(shù)據(jù)記錄集的格式實現(xiàn),只增加了很少的冗余數(shù)據(jù),序列化編碼、解碼的方法簡單,體積小,編碼的效率較高。
參考文獻:
[1]Bruce Eckel(候捷)譯.Java編程思想.第二版.