高效自描述的復(fù)雜數(shù)據(jù)對象序列化方法
【專利摘要】本發(fā)明公開了一種高效自描述的復(fù)雜數(shù)據(jù)對象序列化方法,主要解決了現(xiàn)有技術(shù)中存在的對象序列化處理能力有限,使用和維護較為不便,缺乏統(tǒng)一和一致性的問題。該方法為每種異構(gòu)消息創(chuàng)建一個用于標(biāo)識其類型的唯一消息ID,并創(chuàng)建零個或一個以上用以標(biāo)識各異構(gòu)消息所需傳遞的屬性值的參數(shù),創(chuàng)建各參數(shù)的唯一ID、值類型和二進制保存的值內(nèi)容,并根據(jù)異構(gòu)消息的消息ID,采用二進制方式實現(xiàn)序列化和反序列化。通過上述方案,本發(fā)明達到了便于管理和維護,減少出錯記錄,提高數(shù)據(jù)處理能力的目的,具有很高的實用價值和推廣價值。
【專利說明】高效自描述的復(fù)雜數(shù)據(jù)對象序列化方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種復(fù)雜數(shù)據(jù)對象序列化方法,具體地說,是涉及一種高效自描述的復(fù)雜數(shù)據(jù)對象序列化方法。
【背景技術(shù)】
[0002]對象序列化、反序列化是現(xiàn)代網(wǎng)絡(luò)通訊和遠程調(diào)用技術(shù)的基石,序列化方法將邏輯對象轉(zhuǎn)換為數(shù)據(jù)包,通過網(wǎng)絡(luò)發(fā)送到遠端,遠端服務(wù)器接收到數(shù)據(jù)包后,將其反序列化獲得原始邏輯對象,再進行解析和處理。
[0003]為了提高應(yīng)用效果,要求序列化方法需達到性能、易用性、可擴展性各方面的平衡。目前業(yè)內(nèi)使用最廣泛、評價最高的是谷歌的Protocol Buffers方案,它使用.proto文件定義序列化對象接口,根據(jù)proto定義生成序列化、反序列化接口代碼,使用時用戶程序調(diào)用接口代碼進行序列化和反序列化操作,由于Protocol Buffers使用二進制流編碼,帶寬占用和處理速度都遠遠強于傳統(tǒng)的xml、json等方案,而且有前向兼容性,更新定義升級后不影響使用,接口設(shè)計也簡單,所以是目前最受歡迎的序列化方案之一。
[0004]但是對于大型通訊系統(tǒng),Protocol Buffers存在以下缺陷:
Protocol Buffers對于一些復(fù)雜類型,比如數(shù)組的數(shù)組、字符串?dāng)?shù)組等結(jié)構(gòu)需要通過嵌套消息或者多次序列化來處理,處理性能會嚴(yán)重下降;
Protocol Buffers序列化數(shù)據(jù)僅保留數(shù)據(jù)部分,要成功反序列化接收端必須擁有同一份proto文件,根據(jù)文件里的消息定義才能解析,使用和維護都不方便;
一個大型系統(tǒng)里通常會有非常多的對象需要序列化,但是Protocol Buffers需要為每一種對象定義一個獨立的proto文件,并生成一個獨立的解析代碼,在一個實際項目里,這樣會產(chǎn)生非常多的額外文件,不利于代碼管理,也缺乏統(tǒng)一和一致性。
【發(fā)明內(nèi)容】
[0005]本發(fā)明的目的在于提供一種高效自描述的復(fù)雜數(shù)據(jù)對象序列化方法,主要解決現(xiàn)有技術(shù)中存在的對象序列化處理能力有限,使用和維護較為不便,缺乏統(tǒng)一和一致性的問題。
[0006]為了實現(xiàn)上述目的,本發(fā)明采用的技術(shù)方案如下:
高效自描述的復(fù)雜數(shù)據(jù)對象序列化方法,包括:
為每種異構(gòu)消息創(chuàng)建一個用于標(biāo)識其類型的唯一消息ID,并創(chuàng)建零個或一個以上用以標(biāo)識各異構(gòu)消息所需傳遞的屬性值的參數(shù),創(chuàng)建各參數(shù)的唯一 ID、值類型和二進制保存的值內(nèi)容;
序列化時:
(1)將待序列化異構(gòu)消息的消息ID用二進制方式保存在數(shù)據(jù)包頭;
(2)遍歷異構(gòu)消息的參數(shù)清單,依次將該異構(gòu)消息的參數(shù)序列化為二進制格式追加至存儲有消息ID的數(shù)據(jù)包,直至所有參數(shù)處理完畢,完成對該異構(gòu)消息的序列化; 反序列化時:
(a)讀取待反序列化的異構(gòu)消息的消息ID;
(b)依次讀取該異構(gòu)消息的參數(shù)類型,根據(jù)類型對參數(shù)的二進制數(shù)據(jù)包進行解碼,獲得參數(shù)值;
(c)根據(jù)參數(shù)ID將獲取的參數(shù)值進行保存,直至數(shù)據(jù)包讀取完畢,完成對該異構(gòu)消息的反序列化。
[0007]進一步地,所述參數(shù)二進制格式由用于區(qū)分不同參數(shù)的key和標(biāo)記參數(shù)值類型的value構(gòu)成。
[0008]與現(xiàn)有技術(shù)相比,本發(fā)明具有以下有益效果:
(I)本發(fā)明中,無需獨立定義文件和解析代碼,一個大型系統(tǒng)內(nèi)只需要維護一份參數(shù)值定義文件即可,便于統(tǒng)一管理、減少出錯記錄,且有效降低了維護難度,大幅度提高了復(fù)雜數(shù)據(jù)處理性能,符合實際需求。
【具體實施方式】
[0009]下面結(jié)合附圖和實施例對本發(fā)明作進一步說明,本發(fā)明的實施方式包括但不限于下列實施例。
實施例
[0010]為了解決現(xiàn)有技術(shù)中存在的對象序列化處理能力有限,使用和維護較為不便,缺乏統(tǒng)一和一致性的問題,本發(fā)明公開了一種使用統(tǒng)一方法對各種異構(gòu)消息進行序列化和反序列化處理,且序列化后的二進制數(shù)據(jù)流可以自我描述,無需接口文件和獨立的編解碼代碼就可正確反序列化回原始對象、且適用于復(fù)雜數(shù)據(jù)對象的序列化方法。
[0011]本發(fā)明中,每種異構(gòu)消息都有一個唯一的消息ID,用來標(biāo)識異構(gòu)消息的類型,每個異構(gòu)消息都包含零到多個參數(shù),用來標(biāo)識各種異構(gòu)消息需要傳遞的屬性值,每個參數(shù)都有自己的惟一 ID、值類型和二進制保存的值內(nèi)容,通過此種設(shè)置,序列化通過以下方式實現(xiàn):首先將消息ID用二進制方式保存在數(shù)據(jù)包頭,再遍歷消息的參數(shù)清單,依次將參數(shù)序列化成二進制形式追加到數(shù)據(jù)包,參數(shù)全部處理完畢時,序列化完成;相應(yīng)地,反序列化時,首先讀取消息ID,然后依次讀取參數(shù)類型,根據(jù)類型對參數(shù)的二進制數(shù)據(jù)包進行解碼,獲得參數(shù)值,并根據(jù)參數(shù)ID保存到內(nèi)存中,數(shù)據(jù)包全部讀取完畢,反序列化完成。
[0012]根據(jù)不同的數(shù)據(jù)類型,本實施例中提供了相應(yīng)的編碼規(guī)則,如表I所示,常見的四個基本數(shù)據(jù)存儲格式可如下:
表I
【權(quán)利要求】
1.高效自描述的復(fù)雜數(shù)據(jù)對象序列化方法,其特征在于,包括: 為每種異構(gòu)消息創(chuàng)建一個用于標(biāo)識其類型的唯一消息ID,并創(chuàng)建零個或一個以上用以標(biāo)識各異構(gòu)消息所需傳遞的屬性值的參數(shù),創(chuàng)建各參數(shù)的唯一 ID、值類型和二進制保存的值內(nèi)容; 序列化時: (1)將待序列化異構(gòu)消息的消息ID用二進制方式保存在數(shù)據(jù)包頭; (2)遍歷異構(gòu)消息的參數(shù)清單,依次將該異構(gòu)消息的參數(shù)序列化為二進制格式追加至存儲有消息ID的數(shù)據(jù)包,直至所有參數(shù)處理完畢,完成對該異構(gòu)消息的序列化; 反序列化時: Ca)讀取待反序列化的異構(gòu)消息的消息ID ; (b)依次讀取該異構(gòu)消息的參數(shù)類型,根據(jù)類型對參數(shù)的二進制數(shù)據(jù)包進行解碼,獲得參數(shù)值; (c)根據(jù)參數(shù)ID將獲取的參數(shù)值進行保存,直至數(shù)據(jù)包讀取完畢,完成對該異構(gòu)消息的反序列化。
2.根據(jù)權(quán)利要求1所述的高效自描述的復(fù)雜數(shù)據(jù)對象序列化方法,其特征在于,所述參數(shù)二進制格式由用于區(qū)分不同參數(shù)的key和標(biāo)記參數(shù)值類型的value構(gòu)成。
【文檔編號】G06F17/30GK103778248SQ201410054437
【公開日】2014年5月7日 申請日期:2014年2月18日 優(yōu)先權(quán)日:2014年2月18日
【發(fā)明者】黃睿 申請人:成都致云科技有限公司