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