本發(fā)明實(shí)施例涉及數(shù)據(jù)庫(kù)技術(shù)領(lǐng)域,尤其涉及一種數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化、反序列化方法及裝置。
背景技術(shù):
當(dāng)前主流的數(shù)據(jù)庫(kù)為關(guān)系型數(shù)據(jù)庫(kù),但對(duì)象數(shù)據(jù)庫(kù)也成為數(shù)據(jù)庫(kù)發(fā)展的一個(gè)趨勢(shì)分支。在關(guān)系數(shù)據(jù)庫(kù)中增加對(duì)象類(lèi)型,使用戶(hù)可以根據(jù)現(xiàn)實(shí)世界給對(duì)象建模,日益成為關(guān)系數(shù)據(jù)庫(kù)用戶(hù)的迫切需求,一些關(guān)系數(shù)據(jù)庫(kù)廠商也已對(duì)此提供了支持。
目前數(shù)據(jù)庫(kù)中實(shí)現(xiàn)對(duì)象類(lèi)型主要通過(guò)增加一種“類(lèi)類(lèi)型”的數(shù)據(jù)類(lèi)型支持來(lái)實(shí)現(xiàn)。對(duì)象(object)是現(xiàn)實(shí)存在的描述,相當(dāng)于數(shù)據(jù)庫(kù)中的數(shù)據(jù)。類(lèi)(class)是現(xiàn)實(shí)存在的類(lèi)別,是對(duì)象的抽象,類(lèi)是數(shù)據(jù)庫(kù)中的一種數(shù)據(jù)類(lèi)型,可以由用戶(hù)自定義。類(lèi)類(lèi)型是對(duì)象類(lèi)型,其中包含屬性(用于存儲(chǔ)對(duì)象的狀態(tài))和方法(用于建立對(duì)象的行為模型)。
類(lèi)類(lèi)型可以作為數(shù)據(jù)庫(kù)表中列的數(shù)據(jù)類(lèi)型、過(guò)程化sql語(yǔ)言(plsql)語(yǔ)句塊中變量的數(shù)據(jù)類(lèi)型及函數(shù)參數(shù)的數(shù)據(jù)類(lèi)型。數(shù)據(jù)庫(kù)在存儲(chǔ)表的數(shù)據(jù)時(shí),對(duì)單個(gè)列定義成對(duì)象類(lèi)型的情況,稱(chēng)之為對(duì)象列,含有列對(duì)象的表稱(chēng)為對(duì)象表。創(chuàng)建類(lèi)類(lèi)型的對(duì)象實(shí)例稱(chēng)為類(lèi)的實(shí)例化。
目前一些主流的關(guān)系數(shù)據(jù)庫(kù)都支持對(duì)象類(lèi)型的存儲(chǔ),基本的處理方式是:無(wú)論是在sql語(yǔ)句還是在plsql中處理類(lèi)的實(shí)例化時(shí),都采用特定的類(lèi)數(shù)據(jù)類(lèi)型,生成該類(lèi)型的對(duì)象數(shù)據(jù),包含對(duì)象全部的屬性和方法。在存儲(chǔ)對(duì)象表的對(duì)象列數(shù)據(jù)時(shí),將這個(gè)類(lèi)類(lèi)型的對(duì)象數(shù)據(jù)全部進(jìn)行存儲(chǔ)。
由于現(xiàn)有的關(guān)系數(shù)據(jù)庫(kù)中進(jìn)行對(duì)象數(shù)據(jù)的存儲(chǔ),需要增加特別的對(duì)象類(lèi)型。并且,這樣的對(duì)象類(lèi)型區(qū)別于普通數(shù)據(jù)類(lèi)型進(jìn)行存儲(chǔ)與訪問(wèn),增加了數(shù)據(jù)庫(kù)管理系統(tǒng)的實(shí)現(xiàn)復(fù)雜度和數(shù)據(jù)庫(kù)運(yùn)行時(shí)處理對(duì)象類(lèi)型的代價(jià)。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)上述技術(shù)問(wèn)題,本發(fā)明實(shí)施例提供了一種數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化、反序列化方法及裝置,以實(shí)現(xiàn)在關(guān)系數(shù)據(jù)庫(kù)中采用現(xiàn)有數(shù)據(jù)類(lèi)型支持對(duì)象列的存儲(chǔ)和操作。
第一方面,本發(fā)明實(shí)施例提供了一種數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化方法,所述方法包括:
根據(jù)保存在數(shù)據(jù)字典中對(duì)象列的描述信息獲取對(duì)象列對(duì)應(yīng)的類(lèi)的登記信息;
根據(jù)所述登記信息對(duì)實(shí)例數(shù)據(jù)實(shí)例化,以生成對(duì)象實(shí)例;
在內(nèi)存中分配臨時(shí)數(shù)據(jù)存儲(chǔ)表;
通過(guò)所述臨時(shí)數(shù)據(jù)存儲(chǔ)表,按照預(yù)設(shè)的格式和登記信息將所述對(duì)象實(shí)例的屬性轉(zhuǎn)換為相應(yīng)的二進(jìn)制數(shù)據(jù);
將所述二進(jìn)制數(shù)據(jù)存儲(chǔ)在對(duì)象表中。
第二方面,本發(fā)明實(shí)施例還提供了一種數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的反序列化方法,所述方法包括:
根據(jù)二進(jìn)制數(shù)據(jù)判斷是否為列對(duì)象序列化數(shù)據(jù);
如果為列對(duì)象序列化數(shù)據(jù),在內(nèi)存中分配臨時(shí)數(shù)據(jù)存儲(chǔ)表;
按照預(yù)設(shè)的格式確定對(duì)象對(duì)應(yīng)的類(lèi)唯一標(biāo)識(shí)符和類(lèi)的屬性個(gè)數(shù);
在臨時(shí)數(shù)據(jù)存儲(chǔ)表中寫(xiě)入屬性的屬性值,所述屬性的屬性值按照預(yù)設(shè)的格式讀取。
第三方面,本發(fā)明實(shí)施例還提供了一種數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化裝置,所述裝置包括:
獲取模塊,用于根據(jù)保存在數(shù)據(jù)字典中對(duì)象列的描述信息獲取對(duì)象列對(duì)應(yīng)的類(lèi)的登記信息;
生成模塊,用于根據(jù)所述登記信息對(duì)實(shí)例數(shù)據(jù)實(shí)例化,以生成對(duì)象實(shí)例;
分配模塊,用于在內(nèi)存中分配臨時(shí)數(shù)據(jù)存儲(chǔ)表;
轉(zhuǎn)換模塊,用于通過(guò)所述臨時(shí)數(shù)據(jù)存儲(chǔ)表,按照預(yù)設(shè)的格式和登記信息將所述對(duì)象實(shí)例的屬性轉(zhuǎn)換為相應(yīng)的二進(jìn)制數(shù)據(jù);
存儲(chǔ)模塊,用于將所述二進(jìn)制數(shù)據(jù)存儲(chǔ)在對(duì)象表中。
第四方面,本發(fā)明實(shí)施例還提供了一種數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的反序列化裝置,所述裝置包括:
判斷模塊,用于根據(jù)二進(jìn)制數(shù)據(jù)判斷是否為列對(duì)象序列化數(shù)據(jù);
分配模塊,用于如果為列對(duì)象序列化數(shù)據(jù),在內(nèi)存中分配臨時(shí)數(shù)據(jù)存儲(chǔ)表;
確定模塊,用于按照預(yù)設(shè)的格式確定對(duì)象對(duì)應(yīng)的類(lèi)唯一標(biāo)識(shí)符和類(lèi)的屬性個(gè)數(shù);
讀取模塊,用于在臨時(shí)數(shù)據(jù)存儲(chǔ)表中寫(xiě)入屬性的屬性值,所述屬性的屬性值按照預(yù)設(shè)的格式讀取。
本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化、反序列化方法及裝置,通過(guò)將列對(duì)象的屬性轉(zhuǎn)換為二進(jìn)制數(shù)據(jù),并且可在對(duì)對(duì)象列操作時(shí),通過(guò)二進(jìn)制數(shù)據(jù)與屬性之間的轉(zhuǎn)換,能夠執(zhí)行相應(yīng)的操作。可以較小代價(jià)實(shí)現(xiàn)對(duì)象類(lèi)型支持的擴(kuò)展,并可實(shí)現(xiàn)所有類(lèi)操作。減少了對(duì)新數(shù)據(jù)類(lèi)型的維護(hù)成本,大大簡(jiǎn)化了對(duì)象類(lèi)型在數(shù)據(jù)庫(kù)中的存儲(chǔ)邏輯。
附圖說(shuō)明
通過(guò)閱讀參照以下附圖所作的對(duì)非限制性實(shí)施例所作的詳細(xì)描述,本發(fā)明的其它特征、目的和優(yōu)點(diǎn)將會(huì)變得更明顯:
圖1是本發(fā)明實(shí)施例一提供的對(duì)象列序列化方法的流程示意圖;
圖2是本發(fā)明實(shí)施例一提供的數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化方法中類(lèi)對(duì)象序列化的格式示意圖;
圖3是本發(fā)明實(shí)施例一提供的數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化方法中對(duì)象屬性為數(shù)據(jù)類(lèi)型的格式示意圖;
圖4為本發(fā)明實(shí)施例一提供的數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化方法中對(duì)象屬性為類(lèi)類(lèi)型的格式示意圖;
圖5為本發(fā)明實(shí)施例二提供的數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化方法的流程示意圖;
圖6是本發(fā)明實(shí)施例二提供的數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化方法中增加記錄的標(biāo)識(shí)的屬性值的格式示意圖;
圖7是本發(fā)明實(shí)施例三提供的的數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的反序列化方法的流程示意圖;
圖8是本發(fā)明實(shí)施例四提供的的數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的反序列化方法的流程示意圖;
圖9是本發(fā)明實(shí)施例五提供的對(duì)象列序列化裝置的結(jié)構(gòu)示意圖;
圖10是本發(fā)明實(shí)施例六提供的對(duì)象列反序列化裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面結(jié)合附圖和實(shí)施例對(duì)本發(fā)明作進(jìn)一步的詳細(xì)說(shuō)明。可以理解的是,此處所描述的具體實(shí)施例僅僅用于解釋本發(fā)明,而非對(duì)本發(fā)明的限定。另外還需要說(shuō)明的是,為了便于描述,附圖中僅示出了與本發(fā)明相關(guān)的部分而非全部結(jié)構(gòu)。
實(shí)施例一
本實(shí)施例提供了一種數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化方法。本實(shí)施例的方法可以由數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化裝置來(lái)執(zhí)行,該裝置可通過(guò)硬件和/或軟件的方式實(shí)現(xiàn),并一般可以集成于關(guān)系數(shù)據(jù)庫(kù)內(nèi)。
參見(jiàn)圖1,所述數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化方法,包括:
s110,根據(jù)保存在數(shù)據(jù)字典中對(duì)象列的描述信息獲取對(duì)象列對(duì)應(yīng)的類(lèi)的登記信息。
序列化是指將對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问降倪^(guò)程。在關(guān)系數(shù)據(jù)庫(kù)中,當(dāng)插入類(lèi)的實(shí)例數(shù)據(jù)或者修改實(shí)例數(shù)據(jù)時(shí),由于實(shí)例數(shù)據(jù)不可直接使用,需用類(lèi)創(chuàng)建對(duì)象。并需要將創(chuàng)建的對(duì)象轉(zhuǎn)換為可存儲(chǔ)的數(shù)據(jù)類(lèi)型。修改實(shí)例數(shù)據(jù)可以視為先刪除后插入的操作,因此,在本實(shí)施例中,修改實(shí)例數(shù)據(jù)也可視為插入實(shí)例數(shù)據(jù)的一種。通常,在插入實(shí)例數(shù)據(jù)時(shí),需要對(duì)類(lèi)進(jìn)行實(shí)例化。
數(shù)據(jù)字典是指對(duì)數(shù)據(jù)的數(shù)據(jù)項(xiàng)、數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)流、數(shù)據(jù)存儲(chǔ)、處理邏輯、外部實(shí)體等進(jìn)行定義和描述,其目的是對(duì)數(shù)據(jù)流程圖中的各個(gè)元素做出詳細(xì)的說(shuō)明。數(shù)據(jù)字典由數(shù)據(jù)庫(kù)系統(tǒng)在運(yùn)行時(shí)根據(jù)數(shù)據(jù)庫(kù)的對(duì)象變化自動(dòng)維護(hù)。數(shù)據(jù)字典可存儲(chǔ)字段名、數(shù)據(jù)類(lèi)型、主鍵、外鍵等描述表的屬性的內(nèi)容。在本實(shí)施例中,在根據(jù)保存在數(shù)據(jù)字典中對(duì)象列的描述信息獲取對(duì)象列對(duì)應(yīng)的類(lèi)的登記信息之前,還包括:在類(lèi)被創(chuàng)建時(shí),為所述類(lèi)分配唯一標(biāo)識(shí)符,并記錄所述類(lèi)的名稱(chēng);將所述唯一標(biāo)識(shí)符、類(lèi)的名稱(chēng)和所述類(lèi)的創(chuàng)建語(yǔ)句保存在數(shù)據(jù)字典中。
在數(shù)據(jù)庫(kù)運(yùn)行時(shí),當(dāng)一個(gè)類(lèi)被創(chuàng)建時(shí),通過(guò)對(duì)創(chuàng)建語(yǔ)句的分析,為該類(lèi)分配一個(gè)系統(tǒng)的唯一標(biāo)識(shí)符。示例性,可以通過(guò)類(lèi)頭和/或類(lèi)體的創(chuàng)建語(yǔ)句確定是否為類(lèi)被創(chuàng)建。此外,所述唯一標(biāo)識(shí)符可以為id,并將該id和類(lèi)名和所述類(lèi)的創(chuàng)建語(yǔ)句一起保存在數(shù)據(jù)字典中。供后期在進(jìn)行序列化時(shí)進(jìn)行查找。
在數(shù)據(jù)庫(kù)中創(chuàng)建表時(shí),會(huì)對(duì)表中的每個(gè)列創(chuàng)建描述信息。對(duì)于對(duì)象列,通過(guò)解析,能夠判斷當(dāng)前列的類(lèi)型是否為數(shù)據(jù)庫(kù)基本數(shù)據(jù)類(lèi)型。如果不是數(shù)據(jù)庫(kù)基本數(shù)據(jù)類(lèi)型,將語(yǔ)句中的類(lèi)型名與數(shù)據(jù)字典中記錄的類(lèi)的類(lèi)名進(jìn)行匹配,匹配成功說(shuō)明該列為對(duì)象列,從數(shù)據(jù)字典信息中獲得該類(lèi)的id。
由于數(shù)據(jù)庫(kù)系統(tǒng)內(nèi)部處理對(duì)象列時(shí),是將其作為二進(jìn)制數(shù)據(jù)處理的,因此對(duì)象類(lèi)在內(nèi)存中的描述結(jié)構(gòu)中的類(lèi)型記為二進(jìn)制數(shù)據(jù)類(lèi)型,為了與普通二進(jìn)制數(shù)據(jù)類(lèi)型列進(jìn)行區(qū)分,在列描述結(jié)構(gòu)中增加一個(gè)標(biāo)記用于記錄類(lèi)的id。并將這些描述保存在數(shù)據(jù)字典中。
登記信息可以包括:保存在數(shù)據(jù)字典中的類(lèi)唯一標(biāo)識(shí)符、類(lèi)名稱(chēng)和類(lèi)的創(chuàng)建語(yǔ)句;和保存在內(nèi)存結(jié)構(gòu)中的類(lèi)唯一標(biāo)識(shí)符、類(lèi)名稱(chēng)、加密屬性、繼承屬性、類(lèi)的屬性和方法信息,所述方法信息包括方法中參數(shù)的名稱(chēng)、長(zhǎng)度、數(shù)據(jù)類(lèi)型和方法的調(diào)用指針。
當(dāng)在數(shù)據(jù)庫(kù)中第一次使用一個(gè)類(lèi)時(shí),例如出現(xiàn)在sql語(yǔ)句或plsql中,數(shù)據(jù)庫(kù)系統(tǒng)可以根據(jù)類(lèi)名找到之前創(chuàng)建這個(gè)類(lèi)時(shí)存儲(chǔ)在字典表中的信息,解析字典表中存儲(chǔ)的類(lèi)創(chuàng)建語(yǔ)句,生成一個(gè)內(nèi)存結(jié)構(gòu)ndct_cls_t。ndct_cls_t可以記錄類(lèi)的id、類(lèi)名、加密、繼承屬性等,同時(shí)還記錄了類(lèi)的屬性和方法信息,例如記錄每個(gè)屬性的名字、長(zhǎng)度和數(shù)據(jù)類(lèi)型;以及記錄每個(gè)方法,也包括構(gòu)造函數(shù)的信息,示例性的,可以包括方法的方法名,方法中每個(gè)參數(shù)的名字、長(zhǎng)度和數(shù)據(jù)類(lèi)型,以及方法的調(diào)用指針??梢詫⑸鲜鲂畔⒁员淼姆绞竭M(jìn)行保存。優(yōu)選的,可以采用鏈表方式進(jìn)行保存。
s120,根據(jù)所述登記信息對(duì)所述實(shí)例數(shù)據(jù)實(shí)例化,以生成對(duì)象實(shí)例。
創(chuàng)建類(lèi)類(lèi)型的對(duì)象,即對(duì)類(lèi)進(jìn)行實(shí)例化都通過(guò)類(lèi)的構(gòu)造函數(shù)實(shí)現(xiàn)的。構(gòu)造函數(shù)與類(lèi)名相同。在實(shí)例化時(shí),根據(jù)類(lèi)名在數(shù)據(jù)結(jié)構(gòu)ndct_cls_t中查找到與構(gòu)造函數(shù)的指針,通過(guò)指針調(diào)用構(gòu)造函數(shù),將插入的參數(shù)進(jìn)行實(shí)例化。
示例性的,sql中類(lèi)的實(shí)例化:
selectmycls(100,200);
表中類(lèi)的實(shí)例化:
insertintotvalues(1,mycls(100,200));
plsql中類(lèi)的實(shí)例化:
declare
clsmycls;
begin
cls=newmycls(100,200);
end。
優(yōu)選的,可以將所述根據(jù)類(lèi)名查找內(nèi)存結(jié)構(gòu)中構(gòu)造函數(shù)方法中構(gòu)造函數(shù)的指針執(zhí)行構(gòu)造函數(shù),生成對(duì)象實(shí)例,具體優(yōu)化為:根據(jù)所述內(nèi)存結(jié)構(gòu)中的構(gòu)造函數(shù)方法判斷調(diào)用構(gòu)造函數(shù)的參數(shù)是否正確,如果正確,則根據(jù)類(lèi)名查找內(nèi)存結(jié)構(gòu)中構(gòu)造函數(shù)方法中構(gòu)造函數(shù)的指針執(zhí)行構(gòu)造函數(shù),生成對(duì)象實(shí)例。由于ndct_cls_t數(shù)據(jù)結(jié)構(gòu)中記錄相應(yīng)的方法信息中包括參數(shù)的名稱(chēng)、長(zhǎng)度和數(shù)據(jù)類(lèi)型,可以對(duì)插入的參數(shù)進(jìn)行驗(yàn)證,防止實(shí)例化失敗。
此外,也可將類(lèi)的實(shí)例化數(shù)據(jù)采用表或者其它數(shù)據(jù)結(jié)構(gòu)方式表示。示例性的,可以采用object_t結(jié)構(gòu)表示。object_t結(jié)構(gòu)可以形如(類(lèi)id,對(duì)象id,屬性1,屬性2……屬性n),對(duì)象id為每個(gè)類(lèi)對(duì)象實(shí)例的唯一id。相應(yīng)的,每個(gè)屬性的信息可以包括:類(lèi)標(biāo)記、是否為空、非空數(shù)據(jù)的長(zhǎng)度和數(shù)據(jù)值。之所以采用object_t結(jié)構(gòu)表示,可以將屬性信息分類(lèi)整理,在保證信息完整的前提下,方便轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)。
s130,在內(nèi)存中分配臨時(shí)數(shù)據(jù)存儲(chǔ)表。
為了能夠完成實(shí)際的數(shù)據(jù)寫(xiě)入,首先在內(nèi)存中初始化一個(gè)臨時(shí)數(shù)據(jù)存儲(chǔ)表。由于序列化過(guò)程中會(huì)產(chǎn)生大量的中間數(shù)據(jù),通過(guò)在內(nèi)存中分配臨時(shí)數(shù)據(jù)存儲(chǔ)表,可以以存儲(chǔ)在序列化中產(chǎn)生的中間數(shù)據(jù)。方便對(duì)中間數(shù)據(jù)進(jìn)行加工,以生成最終的數(shù)據(jù)。
s140,通過(guò)所述臨時(shí)數(shù)據(jù)存儲(chǔ)表,按照預(yù)設(shè)的格式和登記信息將所述對(duì)象實(shí)例的屬性轉(zhuǎn)換為相應(yīng)的二進(jìn)制數(shù)據(jù)。
對(duì)象實(shí)例中包括若干屬性,因此,需要將對(duì)象實(shí)例的屬性轉(zhuǎn)換為相應(yīng)的二進(jìn)制數(shù)據(jù)。同時(shí)也需要在二進(jìn)制數(shù)據(jù)中增加該對(duì)象實(shí)例的描述,以與其它對(duì)象實(shí)例進(jìn)行區(qū)分。在本實(shí)施例中,由于序列化的對(duì)象中包括較多的屬性,需要按照設(shè)定的格式將所述對(duì)象轉(zhuǎn)換為對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)。以使得根據(jù)預(yù)設(shè)的格式可從二進(jìn)制數(shù)據(jù)中獲取相應(yīng)的對(duì)象實(shí)例。示例性的,圖2是本發(fā)明實(shí)施例一提供的數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化方法中類(lèi)對(duì)象序列化的格式示意圖,可參照?qǐng)D2所提供的類(lèi)對(duì)象的序列化的格式對(duì)應(yīng)的規(guī)則,進(jìn)行序列化。由圖2可以看出,預(yù)設(shè)格式包括對(duì)象實(shí)例本身的描述,即包括類(lèi)標(biāo)識(shí),用于說(shuō)明序列化后二進(jìn)制數(shù)據(jù)是否為類(lèi)對(duì)象,類(lèi)id則表明其在數(shù)據(jù)字典中的類(lèi)id。對(duì)象實(shí)例的屬性則包括:屬性個(gè)數(shù)和每個(gè)屬性值,屬性個(gè)數(shù)可用于判斷序列化后的二進(jìn)制數(shù)據(jù)是否完整。本領(lǐng)域技術(shù)人員可在本實(shí)施例的教導(dǎo)下,對(duì)預(yù)設(shè)的格式進(jìn)行各種調(diào)整,在此不做贅述。
相應(yīng)的,可以按照如下方式進(jìn)行轉(zhuǎn)換:向二進(jìn)制數(shù)據(jù)流寫(xiě)入是否為類(lèi)的標(biāo)識(shí)、類(lèi)標(biāo)識(shí)符、屬性個(gè)數(shù)和屬性值。由于二進(jìn)制數(shù)據(jù)流是按照預(yù)設(shè)規(guī)則不停寫(xiě)入處于變化之中,通常緩存在所述臨時(shí)數(shù)據(jù)存儲(chǔ)表中,并。在所述屬性包括對(duì)象時(shí),需要寫(xiě)入是否為類(lèi)的標(biāo)識(shí),以使得能夠從生成的二進(jìn)制數(shù)據(jù)中設(shè)定的位中確定是否為對(duì)象屬性。
對(duì)象的屬性可以包括兩種類(lèi)型,一種為普通數(shù)據(jù)類(lèi)型,另一種則為類(lèi)類(lèi)型。對(duì)于普通數(shù)據(jù)類(lèi)型,可以按照?qǐng)D3中設(shè)定格式進(jìn)行變換。圖3是本發(fā)明實(shí)施例一提供的數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化方法中對(duì)象屬性為普通數(shù)據(jù)類(lèi)型的格式示意圖,由圖3可以看出,普通數(shù)據(jù)類(lèi)型的屬性值可以包括:是否為空標(biāo)識(shí)、數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)值??梢园凑?qǐng)D3所對(duì)應(yīng)的格式將屬性值寫(xiě)入二進(jìn)制數(shù)據(jù)流。
對(duì)象類(lèi)型的一個(gè)重要特性就是對(duì)象中可以嵌套別的對(duì)象,因此,對(duì)象實(shí)例屬性中仍然可以為類(lèi)類(lèi)型。圖4為本發(fā)明實(shí)施例一提供的數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化方法中對(duì)象屬性為類(lèi)類(lèi)型的格式示意圖,由圖4可以看出,對(duì)于對(duì)象的屬性仍然是對(duì)象時(shí),增加了類(lèi)id的屬性。由于類(lèi)名相對(duì)于類(lèi)的唯一標(biāo)識(shí)符,即類(lèi)的id較長(zhǎng),不適于將其作為對(duì)象實(shí)例的相關(guān)信息,并一并轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)。因此,需要根據(jù)登記信息獲取到對(duì)象實(shí)例所對(duì)應(yīng)的類(lèi)的id,并將類(lèi)的id作為信息,一并轉(zhuǎn)換為相應(yīng)的二進(jìn)制數(shù)據(jù)。類(lèi)類(lèi)型屬性除包括上述屬性外還包括:屬性中對(duì)象的類(lèi)標(biāo)識(shí)符。通過(guò)增加類(lèi)標(biāo)識(shí)符,可以清楚地表明對(duì)象之間的嵌套關(guān)系。
所述二進(jìn)制數(shù)據(jù)可以選用二進(jìn)制大對(duì)象(binarylargeobject,blob),采用blob可以存儲(chǔ)尺寸較大的文件,適于對(duì)象實(shí)例。
s150,將所述二進(jìn)制數(shù)據(jù)存儲(chǔ)在對(duì)象表中。
將上述在臨時(shí)數(shù)據(jù)存儲(chǔ)表中生成的完整的二進(jìn)制數(shù)據(jù)存儲(chǔ)在對(duì)象表中,將對(duì)象的屬性以二進(jìn)制數(shù)據(jù)形式進(jìn)行保存,完成對(duì)象列的序列化。
本實(shí)施例通過(guò)對(duì)象列中的類(lèi)的登記信息,對(duì)實(shí)例數(shù)據(jù)進(jìn)行實(shí)例化,以生成對(duì)象實(shí)例,并在內(nèi)存中分配的臨時(shí)數(shù)據(jù)存儲(chǔ)表,按照預(yù)設(shè)的格式和登記信息將對(duì)象實(shí)例轉(zhuǎn)換為二進(jìn)制數(shù)據(jù),并將二進(jìn)制數(shù)據(jù)存儲(chǔ)在對(duì)象表中??梢圆捎枚M(jìn)制數(shù)據(jù)表達(dá)對(duì)象實(shí)例,無(wú)需增加數(shù)據(jù)類(lèi)型的種類(lèi)??梢暂^小代價(jià)實(shí)現(xiàn)對(duì)象類(lèi)型支持的擴(kuò)展,并可實(shí)現(xiàn)類(lèi)的插入、刪除和修改操作。減少了對(duì)新數(shù)據(jù)類(lèi)型的維護(hù)成本,大大簡(jiǎn)化了對(duì)象類(lèi)型在數(shù)據(jù)庫(kù)中的存儲(chǔ)邏輯。
在本實(shí)施例的一個(gè)優(yōu)選實(shí)施方式中,在將所述二進(jìn)制數(shù)據(jù)流存儲(chǔ)在對(duì)象表中,還可增加如下步驟:銷(xiāo)毀所述臨時(shí)數(shù)據(jù)存儲(chǔ)表,以釋放內(nèi)存。由于對(duì)象實(shí)例的屬性信息較多,占據(jù)內(nèi)存的空間較大。在完成序列化后,將臨時(shí)數(shù)據(jù)存儲(chǔ)表銷(xiāo)毀,以釋放內(nèi)存,以提高系統(tǒng)的運(yùn)行效率。
實(shí)施例二
圖5為本發(fā)明實(shí)施例二提供的數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化方法的流程示意圖。本實(shí)施例以上述實(shí)施例為基礎(chǔ)進(jìn)行優(yōu)化,將所述按照預(yù)設(shè)的格式和登記信息將所述對(duì)象實(shí)例轉(zhuǎn)換為相應(yīng)的二進(jìn)制數(shù)據(jù),具體優(yōu)化為:在寫(xiě)入屬性為對(duì)象時(shí),判斷臨時(shí)數(shù)據(jù)存儲(chǔ)表中是否存在所述對(duì)象的唯一標(biāo)識(shí)符;如果不存在所述對(duì)象的唯一標(biāo)識(shí)符,則在臨時(shí)數(shù)據(jù)存儲(chǔ)表中記錄所述對(duì)象的唯一標(biāo)識(shí)符,并生成所述對(duì)象在所述臨時(shí)數(shù)據(jù)存儲(chǔ)表中記錄的標(biāo)識(shí),在二進(jìn)制數(shù)據(jù)流中寫(xiě)入未標(biāo)記標(biāo)識(shí)、所述對(duì)象對(duì)應(yīng)的類(lèi)唯一標(biāo)識(shí)符、屬性個(gè)數(shù)和屬性值;如果存在所述對(duì)象的唯一標(biāo)識(shí)符,則從所述臨時(shí)數(shù)據(jù)存儲(chǔ)表取出記錄的對(duì)象標(biāo)記標(biāo)識(shí),在二進(jìn)制數(shù)據(jù)流中寫(xiě)入已標(biāo)記標(biāo)識(shí)和所述記錄的對(duì)象標(biāo)記的標(biāo)識(shí)。
參見(jiàn)圖5,所述數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化方法,包括:
s210,根據(jù)保存在數(shù)據(jù)字典中對(duì)象列的描述信息獲取對(duì)象列對(duì)應(yīng)的類(lèi)的登記信息。
s220,根據(jù)所述登記信息對(duì)所述實(shí)例數(shù)據(jù)實(shí)例化,以生成對(duì)象實(shí)例。
s230,在內(nèi)存中分配臨時(shí)數(shù)據(jù)存儲(chǔ)表。
s240,通過(guò)所述臨時(shí)數(shù)據(jù)存儲(chǔ)表,在寫(xiě)入屬性為對(duì)象時(shí),判斷臨時(shí)數(shù)據(jù)存儲(chǔ)表中是否存在所述對(duì)象的唯一標(biāo)識(shí)符。
一個(gè)對(duì)象的成員屬性可以是另一個(gè)對(duì)象。也就是說(shuō),對(duì)象之間可以相互嵌套。并且一個(gè)類(lèi)的多個(gè)屬性可能包含同一個(gè)對(duì)象,或者多個(gè)類(lèi)對(duì)象中可能都包括同一對(duì)象的屬性。在這種情況下,如果對(duì)重復(fù)的同一對(duì)象的屬性都進(jìn)行序列化時(shí),必然消耗大量的內(nèi)存空間和時(shí)間。因此,在本實(shí)施例中,在寫(xiě)入屬性為對(duì)象時(shí),判斷臨時(shí)數(shù)據(jù)存儲(chǔ)表中是否存在所述對(duì)象的唯一標(biāo)識(shí)符。利用唯一標(biāo)識(shí)符可以判斷所述對(duì)象是否重復(fù)。
s250,如果不存在所述對(duì)象的唯一標(biāo)識(shí)符,則在臨時(shí)數(shù)據(jù)存儲(chǔ)表中記錄所述對(duì)象的唯一標(biāo)識(shí)符,并生成所述對(duì)象標(biāo)記,在二進(jìn)制數(shù)據(jù)流中寫(xiě)入未標(biāo)記標(biāo)識(shí)、所述對(duì)象對(duì)應(yīng)的類(lèi)唯一標(biāo)識(shí)符、屬性個(gè)數(shù)和屬性值。
如果臨時(shí)數(shù)據(jù)存儲(chǔ)表不存在所述對(duì)象的唯一標(biāo)識(shí)符,則說(shuō)明所述對(duì)象對(duì)應(yīng)的類(lèi)以前沒(méi)有出現(xiàn)過(guò)。需要在臨時(shí)數(shù)據(jù)存儲(chǔ)表中記錄。由于對(duì)象的唯一標(biāo)識(shí)符可以表示該對(duì)象,通過(guò)數(shù)據(jù)字典和ndct_cls_t能夠獲取到該對(duì)象的信息,因此可將對(duì)象的唯一標(biāo)識(shí)符記錄在臨時(shí)數(shù)據(jù)存儲(chǔ)表中。以使得所述對(duì)象后續(xù)出現(xiàn)時(shí),可以利用該對(duì)象的唯一標(biāo)識(shí)符。由于對(duì)象中包含指向同一對(duì)象的屬性對(duì)象可能存在多個(gè),因此還要生成所述對(duì)象在所述臨時(shí)數(shù)據(jù)存儲(chǔ)表中記錄的標(biāo)識(shí)。
示例性的,所述對(duì)象的記錄標(biāo)識(shí)可以為pack_id,其中pack_id為從1開(kāi)始遞增的整數(shù)。每當(dāng)一個(gè)新的對(duì)象出現(xiàn)時(shí),即在原來(lái)pack_id的基礎(chǔ)上加一。生成新的pack_id并保存在臨時(shí)數(shù)據(jù)存儲(chǔ)表中。在二進(jìn)制數(shù)據(jù)流中寫(xiě)入未標(biāo)記標(biāo)識(shí)、所述對(duì)象對(duì)應(yīng)的類(lèi)唯一標(biāo)識(shí)符、屬性個(gè)數(shù)和屬性值。通過(guò)未標(biāo)記標(biāo)識(shí)可標(biāo)記該對(duì)象是首次出現(xiàn)。
s260,如果存在所述對(duì)象的唯一標(biāo)識(shí)符,則從所述臨時(shí)數(shù)據(jù)存儲(chǔ)表取出記錄的對(duì)象標(biāo)記的標(biāo)識(shí),在二進(jìn)制數(shù)據(jù)流中寫(xiě)入已標(biāo)記標(biāo)識(shí)和所述記錄的對(duì)象標(biāo)記的標(biāo)識(shí)。
如果存在所述對(duì)象的唯一標(biāo)識(shí)符,則說(shuō)明所述對(duì)象之前出現(xiàn)過(guò)。因此只需取出記錄的標(biāo)識(shí)pack_id,在二進(jìn)制數(shù)據(jù)流中寫(xiě)入已標(biāo)記標(biāo)識(shí)和所述記錄的對(duì)象標(biāo)記的標(biāo)識(shí)。這樣,在序列化時(shí),就無(wú)需對(duì)相同的對(duì)象重復(fù)進(jìn)行序列化。只需在二進(jìn)制數(shù)據(jù)流中寫(xiě)入pack_id即可。
例如:有下面的三個(gè)類(lèi):
createclasscls01asaint;bint;end;
createclasscls02ascint;dint;end;,
createclassclsaasc1int,c2cls01;c3cls01;c4cls02;end;
可以看到,類(lèi)clsa有4個(gè)屬性,c1為普通數(shù)據(jù)類(lèi)型,c2和c3為類(lèi)cls01類(lèi)型,c4為cls02類(lèi)型,下面實(shí)例化一個(gè)類(lèi)對(duì)象:
o1=cls01(1,2);
o2=cls02(2,3);
o=clsa(1,o1,o1,o2);
o1為類(lèi)cls01的對(duì)象實(shí)例,o2為cls02類(lèi)的對(duì)象實(shí)例,o為clsa的對(duì)象實(shí)例,其中屬性c2和c3指向同一個(gè)對(duì)象實(shí)例o1。當(dāng)將對(duì)象o插入對(duì)象列時(shí),依據(jù)上述類(lèi)對(duì)象序列化的規(guī)則,將對(duì)象o進(jìn)行序列化。
圖6是本發(fā)明實(shí)施例二提供的數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化方法中增加記錄的標(biāo)識(shí)的屬性值的格式示意圖,圖6示出了按照上述方案序列化的屬性的格式。由圖6可以看出,增加了是否已標(biāo)記標(biāo)識(shí),即是否是已pack的位,如果已pack的位為標(biāo)識(shí)0,則仍舊按照實(shí)施例一中的圖3的格式進(jìn)行序列化。如果已pack的位為標(biāo)識(shí)1,則可刪除相應(yīng)的屬性值,只需標(biāo)記packid即可。
s270,將所述二進(jìn)制數(shù)據(jù)存儲(chǔ)在對(duì)象表中。
本實(shí)施例通過(guò)將所述按照預(yù)設(shè)的格式和登記信息將所述對(duì)象實(shí)例轉(zhuǎn)換為相應(yīng)的二進(jìn)制數(shù)據(jù),具體優(yōu)化為:在寫(xiě)入屬性為對(duì)象時(shí),判斷臨時(shí)數(shù)據(jù)存儲(chǔ)表中是否存在所述對(duì)象的唯一標(biāo)識(shí)符;如果不存在所述對(duì)象的唯一標(biāo)識(shí)符,則在臨時(shí)數(shù)據(jù)存儲(chǔ)表中記錄所述對(duì)象的唯一標(biāo)識(shí)符,并生成所述對(duì)象在所述臨時(shí)數(shù)據(jù)存儲(chǔ)表中記錄的標(biāo)識(shí),在二進(jìn)制數(shù)據(jù)流中寫(xiě)入未標(biāo)記標(biāo)識(shí)、所述對(duì)象對(duì)應(yīng)的類(lèi)唯一標(biāo)識(shí)符、屬性個(gè)數(shù)和屬性值;如果存在所述對(duì)象的唯一標(biāo)識(shí)符,則從所述臨時(shí)數(shù)據(jù)存儲(chǔ)表取出記錄的對(duì)象標(biāo)記的標(biāo)識(shí),在二進(jìn)制數(shù)據(jù)流中寫(xiě)入已標(biāo)記標(biāo)識(shí)和所述記錄的對(duì)象標(biāo)記的標(biāo)識(shí)。通過(guò)臨時(shí)數(shù)據(jù)存儲(chǔ)表和所述對(duì)象在所述臨時(shí)數(shù)據(jù)存儲(chǔ)表中記錄的標(biāo)識(shí),能夠識(shí)別包含指向同一對(duì)象的屬性對(duì)象是否已經(jīng)被序列化,并在序列化時(shí),直接讀取同一屬性對(duì)象的序列化結(jié)果,無(wú)需對(duì)同一對(duì)象多次序列化。減少了空間的消耗,提升了序列化的速度。
實(shí)施例三
本實(shí)施例提供了一種數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的反序列化方法。本實(shí)施例的方法可以由數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的反序列化裝置來(lái)執(zhí)行,該裝置可通過(guò)硬件和/或軟件的方式實(shí)現(xiàn),并一般可以集成于關(guān)系數(shù)據(jù)庫(kù)內(nèi)。
參見(jiàn)圖7,所述數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的反序列化方法包括:
s310,根據(jù)二進(jìn)制數(shù)據(jù)判斷是否為列對(duì)象序列化數(shù)據(jù)。
反序列化可以看做是序列化的逆過(guò)程,其作用是將通用存儲(chǔ)格式的數(shù)據(jù),例如二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為對(duì)象。在本實(shí)施例中,將按照上述實(shí)施例中按照預(yù)設(shè)格式生成的二進(jìn)制數(shù)據(jù)重新轉(zhuǎn)換為對(duì)象。
通常,在數(shù)據(jù)庫(kù)進(jìn)行查詢(xún)操作時(shí),由于需要通過(guò)對(duì)象的屬性作為條件進(jìn)行查詢(xún),而二進(jìn)制數(shù)據(jù)無(wú)法滿足查詢(xún)條件,因此需要進(jìn)行反序列化。
由于二進(jìn)制數(shù)據(jù)可能是普通的二進(jìn)制數(shù)據(jù)也可能是借用二進(jìn)制數(shù)據(jù)存儲(chǔ)的序列化的類(lèi)對(duì)象數(shù)據(jù)。因此,需要從二進(jìn)制數(shù)據(jù)中判斷是否為列對(duì)象序列化數(shù)據(jù)。示例性的,可以通過(guò)二進(jìn)制數(shù)據(jù)中的是否為類(lèi)的標(biāo)識(shí)位數(shù)據(jù)判斷是否為列對(duì)象序列化數(shù)據(jù)。例如是否為類(lèi)的標(biāo)識(shí)位數(shù)據(jù)為1,則為列對(duì)象序列化數(shù)據(jù);若為0,則為普通數(shù)據(jù)。類(lèi)的標(biāo)識(shí)位可以按照預(yù)設(shè)的格式確定二進(jìn)制數(shù)據(jù)中的具體位置。例如,可以是二進(jìn)制數(shù)據(jù)的首位。
s320,如果為列對(duì)象序列化數(shù)據(jù),在內(nèi)存中分配臨時(shí)數(shù)據(jù)存儲(chǔ)表。
根據(jù)上述步驟判斷,如果為列對(duì)象序列化數(shù)據(jù),則在內(nèi)存中分配相應(yīng)的區(qū)域,用于存儲(chǔ)臨時(shí)數(shù)據(jù)。由于反序列化過(guò)程中會(huì)產(chǎn)生大量的中間數(shù)據(jù),通過(guò)在內(nèi)存中分配臨時(shí)數(shù)據(jù)存儲(chǔ)表,可以存儲(chǔ)在反序列化中產(chǎn)生的中間數(shù)據(jù)。方便對(duì)中間數(shù)據(jù)進(jìn)行加工,以生成最終的對(duì)象屬性。
s330,按照預(yù)設(shè)的格式確定對(duì)象對(duì)應(yīng)的類(lèi)唯一標(biāo)識(shí)符和屬性個(gè)數(shù)。
與上述步驟操作類(lèi)似,確定對(duì)象對(duì)應(yīng)的類(lèi)唯一標(biāo)識(shí)符也可通過(guò)二進(jìn)制數(shù)據(jù)中的類(lèi)唯一標(biāo)識(shí)符和屬性個(gè)數(shù)相應(yīng)位的數(shù)據(jù)。例如類(lèi)唯一標(biāo)識(shí)符可以是二進(jìn)制數(shù)據(jù)中第2-5位,之所以選擇4位,則是充分考慮了對(duì)象列中類(lèi)的數(shù)量,當(dāng)然,其具體位數(shù)和位置也可根據(jù)情況進(jìn)行調(diào)整。相應(yīng)的,二進(jìn)制數(shù)據(jù)中第6-9位可以為屬性個(gè)數(shù)。具體的,在二進(jìn)制數(shù)據(jù)中的位置和位數(shù)由預(yù)設(shè)的格式?jīng)Q定。
s340,在臨時(shí)數(shù)據(jù)存儲(chǔ)表中寫(xiě)入屬性的屬性值,所述屬性的屬性值按照預(yù)設(shè)的格式讀取。對(duì)象的屬性可以包括兩種類(lèi)型,一種為普通數(shù)據(jù)類(lèi)型,另一種則為類(lèi)類(lèi)型??梢愿鶕?jù)是否為類(lèi)的標(biāo)識(shí)區(qū)分普通數(shù)據(jù)類(lèi)型或者類(lèi)類(lèi)型。對(duì)于普通數(shù)據(jù)類(lèi)型,可按照設(shè)定格式進(jìn)行讀取數(shù)據(jù)值,并可通過(guò)數(shù)據(jù)長(zhǎng)度進(jìn)行校正。對(duì)象類(lèi)型的一個(gè)重要特性就是對(duì)象中可以嵌套別的對(duì)象,因此,對(duì)象實(shí)例屬性中仍然可以為類(lèi)類(lèi)型。對(duì)于這種嵌套類(lèi)型,則需要讀出該對(duì)象的類(lèi)唯一標(biāo)識(shí)符、屬性個(gè)數(shù)和屬性值。
由于讀出屬性值是一個(gè)過(guò)程,在此過(guò)程中產(chǎn)生的數(shù)據(jù)可以緩存在臨時(shí)數(shù)據(jù)存儲(chǔ)表中。在讀出屬性值完成后,可以從臨時(shí)數(shù)據(jù)存儲(chǔ)表中獲取屬性值,并可利用所述屬性值實(shí)現(xiàn)查詢(xún)等操作。
本實(shí)施例通過(guò)判斷根據(jù)預(yù)設(shè)的格式在臨時(shí)數(shù)據(jù)存儲(chǔ)表中讀取相應(yīng)的對(duì)象屬性和屬性信息,可以直接從序列化數(shù)據(jù)中直接獲取得到對(duì)象列的實(shí)例數(shù)據(jù)。可以在用戶(hù)查詢(xún)對(duì)象列時(shí),將類(lèi)對(duì)象數(shù)據(jù)返回給用戶(hù)。實(shí)現(xiàn)傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)支持對(duì)象列的查詢(xún)操作。
在本實(shí)施例的一個(gè)優(yōu)選實(shí)施方式中,在將在臨時(shí)數(shù)據(jù)存儲(chǔ)表中寫(xiě)入屬性的屬性值,所述屬性的屬性值按照預(yù)設(shè)的格式讀取之后,還可增加如下步驟:
將所述寫(xiě)入屬性的屬性值存入內(nèi)存結(jié)構(gòu)中,并銷(xiāo)毀所述臨時(shí)數(shù)據(jù)存儲(chǔ)表;或在查詢(xún)操作結(jié)束時(shí),銷(xiāo)毀所述臨時(shí)數(shù)據(jù)存儲(chǔ)表。優(yōu)選的,可以在反序列化開(kāi)始時(shí),生成內(nèi)存結(jié)構(gòu)object_t,可以將其設(shè)為obj1,為其生成一個(gè)新的對(duì)象id;并將按照預(yù)設(shè)的格式讀取的各種信息填入obj1。在進(jìn)行查詢(xún)操作時(shí),可以直接從內(nèi)存結(jié)構(gòu)中獲取屬性。由于臨時(shí)數(shù)據(jù)存儲(chǔ)表中存儲(chǔ)著中間數(shù)據(jù),數(shù)據(jù)量較大,因此,在將屬性存入內(nèi)存結(jié)構(gòu)后,可以銷(xiāo)毀所述臨時(shí)數(shù)據(jù)存儲(chǔ)表,以釋放內(nèi)存?;蛘咭部稍诓樵?xún)時(shí),直接采用臨時(shí)數(shù)據(jù)存儲(chǔ)表中在讀出屬性值完成后生成的屬性數(shù)據(jù)。并在在查詢(xún)操作結(jié)束時(shí),銷(xiāo)毀所述臨時(shí)數(shù)據(jù)存儲(chǔ)表。以釋放內(nèi)存,以提高系統(tǒng)的運(yùn)行效率。
實(shí)施例四
圖8為本發(fā)明實(shí)施例四提供的數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的反序列化方法的流程示意圖。本實(shí)施例以上述實(shí)施例為基礎(chǔ)進(jìn)行優(yōu)化,將所述按照預(yù)設(shè)的格式讀取屬性的屬性值,具體優(yōu)化為:根據(jù)屬性值中是否為類(lèi)的標(biāo)識(shí)判斷屬性是否為類(lèi)類(lèi)型,如果為類(lèi)類(lèi)型,則讀取所述對(duì)象是否已標(biāo)記的標(biāo)識(shí);如果為未標(biāo)記標(biāo)識(shí),則生成所述對(duì)象的唯一標(biāo)識(shí)符和對(duì)象標(biāo)記的標(biāo)識(shí),并從所述二進(jìn)制數(shù)據(jù)中讀取所述屬性中類(lèi)類(lèi)型的類(lèi)唯一標(biāo)識(shí)符、屬性個(gè)數(shù)和屬性值,并將所述類(lèi)唯一標(biāo)識(shí)符、屬性個(gè)數(shù)和屬性值存入單元格式中。并將所述單元格式的指針寫(xiě)入對(duì)應(yīng)的屬性值中;如果所述對(duì)象是否已標(biāo)記的標(biāo)識(shí)為已標(biāo)記標(biāo)識(shí),根據(jù)所述對(duì)象標(biāo)記查找對(duì)應(yīng)的對(duì)象唯一標(biāo)識(shí)符,并通過(guò)所述唯一標(biāo)識(shí)符確定對(duì)應(yīng)的單元格式,將指向所述單元格式的指針寫(xiě)入屬性值中。
參見(jiàn)圖8,所述數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的反序列化方法,包括:
s410,根據(jù)二進(jìn)制數(shù)據(jù)判斷是否為列對(duì)象序列化數(shù)據(jù)。
s420,如果為列對(duì)象序列化數(shù)據(jù),在內(nèi)存中分配臨時(shí)數(shù)據(jù)存儲(chǔ)表。
s430,按照預(yù)設(shè)的格式確定對(duì)象對(duì)應(yīng)的類(lèi)唯一標(biāo)識(shí)符和屬性個(gè)數(shù)。
s440,根據(jù)屬性值中是否為類(lèi)的標(biāo)識(shí)判斷屬性是否為類(lèi)類(lèi)型,如果為類(lèi)類(lèi)型,則讀取所述對(duì)象是否已標(biāo)記的標(biāo)識(shí)。
如上述實(shí)施例所述,一個(gè)類(lèi)的多個(gè)屬性可能包含同一個(gè)對(duì)象,或者多個(gè)類(lèi)對(duì)象中可能都包括同一對(duì)象的屬性。由于在序列化時(shí),利用臨時(shí)數(shù)據(jù)存儲(chǔ)表和對(duì)象標(biāo)記,可避免對(duì)相同的對(duì)象重復(fù)進(jìn)行序列化。由于是利用對(duì)象標(biāo)記確定所述對(duì)象是否已經(jīng)被序列化,因此,在確定屬性為類(lèi)類(lèi)型時(shí),需要讀取所述對(duì)象標(biāo)記的標(biāo)識(shí)。讀取對(duì)象標(biāo)記的標(biāo)識(shí)同樣需要按照預(yù)設(shè)的格式從相應(yīng)位讀取。示例性的,對(duì)象標(biāo)記為pack標(biāo)記,可分為已pack和未pack標(biāo)記,分別用1和0表示。pack標(biāo)記可以在類(lèi)類(lèi)型屬性的的二進(jìn)制數(shù)據(jù)的第三位,可通過(guò)讀取類(lèi)類(lèi)型屬性的的二進(jìn)制數(shù)據(jù)的第三位讀取所述對(duì)象標(biāo)記的標(biāo)識(shí)。
s450,如果所述對(duì)象是否已標(biāo)記的標(biāo)識(shí)為未標(biāo)記標(biāo)識(shí),則生成所述對(duì)象的唯一標(biāo)識(shí)符和對(duì)象標(biāo)記的標(biāo)識(shí),并從所述二進(jìn)制數(shù)據(jù)中讀取所述屬性中類(lèi)唯一標(biāo)識(shí)符、屬性個(gè)數(shù)和屬性值,并將所述類(lèi)唯一標(biāo)識(shí)符、屬性個(gè)數(shù)和屬性值存入單元格式中,并將所述單元格式的指針寫(xiě)入對(duì)應(yīng)的屬性值中。
如果讀取到所述對(duì)象是否已標(biāo)記的標(biāo)識(shí)為未標(biāo)記標(biāo)識(shí),則說(shuō)明屬性中的對(duì)象是相同對(duì)象中第一個(gè)被序列化的。因此為其生成一個(gè)新的對(duì)象標(biāo)識(shí)符和對(duì)象標(biāo)記的標(biāo)識(shí),并將所述對(duì)象的唯一標(biāo)識(shí)符和對(duì)象標(biāo)記標(biāo)識(shí)寫(xiě)入臨時(shí)數(shù)據(jù)存儲(chǔ)表。供后續(xù)其它對(duì)象屬性在反序列化時(shí)進(jìn)行查找。并按照預(yù)設(shè)的格式讀取屬性信息,并將這些屬性信息存入預(yù)設(shè)的單元格式。所述單元格式可根據(jù)預(yù)設(shè)格式生成,可以將從二進(jìn)制數(shù)據(jù)中讀取的各種信息填入并存儲(chǔ)。所述單元格式可以在臨時(shí)數(shù)據(jù)存儲(chǔ)表中分配得到,也可以在內(nèi)存中分配得到。
示例性的,可以在反序列化開(kāi)始時(shí),生成內(nèi)存結(jié)構(gòu)object_t,該內(nèi)存結(jié)構(gòu)也可以視為一種單元格式,可以將其設(shè)為obj1。若其屬性中是否已pack標(biāo)記為0,則初始化一個(gè)object_t內(nèi)存結(jié)構(gòu),設(shè)為objn,為其生成一個(gè)新的對(duì)象id,將此新的對(duì)象id和pack_id,其中pack_id為從1開(kāi)始遞增的整數(shù)寫(xiě)入臨時(shí)數(shù)據(jù)存儲(chǔ)表。從二進(jìn)制字節(jié)中讀取objn對(duì)應(yīng)的類(lèi)的類(lèi)id、屬性個(gè)數(shù)和每個(gè)屬性的屬性值填入objn,將指向objn的指針寫(xiě)入obj1,通過(guò)將指向objn的指針寫(xiě)入obj1,可以在查詢(xún)對(duì)象時(shí),根據(jù)指針即可得到對(duì)象屬性。
s460,如果所述對(duì)象是否已標(biāo)記的標(biāo)識(shí)為已標(biāo)記標(biāo)識(shí),根據(jù)所述對(duì)象標(biāo)記的標(biāo)識(shí)查找對(duì)應(yīng)的對(duì)象唯一標(biāo)識(shí)符,并通過(guò)所述唯一標(biāo)識(shí)符確定對(duì)應(yīng)的單元格式,將指向所述單元格式的指針寫(xiě)入屬性值中。
如果所述對(duì)象是否已標(biāo)記的標(biāo)識(shí)為已標(biāo)記標(biāo)識(shí),則說(shuō)明屬性中的對(duì)象已經(jīng)被反序列化,無(wú)需重復(fù)進(jìn)行反序列化,只需讀取出對(duì)象標(biāo)記的標(biāo)識(shí),根據(jù)對(duì)象標(biāo)記的標(biāo)識(shí)在臨時(shí)數(shù)據(jù)存儲(chǔ)表中查找相應(yīng)的對(duì)象唯一標(biāo)識(shí)符,并根據(jù)對(duì)象唯一標(biāo)識(shí)符找到以前生成的單元格式。
示例性的,若已pack標(biāo)記為1,從二進(jìn)制數(shù)據(jù)中順序讀出pack_id,根據(jù)此pack_id去內(nèi)存臨時(shí)表中尋找對(duì)應(yīng)的對(duì)象id,再根據(jù)此對(duì)象id找到之前已生成的ojbn,將指向objn的指針寫(xiě)入obj1。由于屬性存儲(chǔ)在objn內(nèi)存結(jié)構(gòu)中,因此,只需將objn的指針寫(xiě)入obj1的屬性中。
本實(shí)施例通過(guò)將所述按照預(yù)設(shè)的格式讀取屬性的屬性值,具體優(yōu)化為:在根據(jù)屬性值中是否為類(lèi)的標(biāo)識(shí)判斷屬性是否為類(lèi)類(lèi)型,如果為類(lèi)類(lèi)型,則讀取所述對(duì)象是否已標(biāo)記的標(biāo)識(shí);如果所述對(duì)象是否已標(biāo)記的標(biāo)識(shí)為未標(biāo)記標(biāo)識(shí),則生成所述對(duì)象的唯一標(biāo)識(shí)符和對(duì)象標(biāo)記的標(biāo)識(shí),并從所述二進(jìn)制數(shù)據(jù)中讀取所述屬性中類(lèi)類(lèi)型的類(lèi)唯一標(biāo)識(shí)符、屬性個(gè)數(shù)和屬性值,并將所述類(lèi)唯一標(biāo)識(shí)符、屬性個(gè)數(shù)和屬性值存入單元格式中,并將所述單元格式的指針寫(xiě)入對(duì)應(yīng)的屬性值中;如果所述對(duì)象是否已標(biāo)記的標(biāo)識(shí)為已標(biāo)記標(biāo)識(shí),根據(jù)所述對(duì)象標(biāo)記的標(biāo)識(shí)查找對(duì)應(yīng)的對(duì)象唯一標(biāo)識(shí)符,并通過(guò)所述唯一標(biāo)識(shí)符確定對(duì)應(yīng)的單元格式,將指向所述單元格式的指針寫(xiě)入屬性值中。通過(guò)臨時(shí)數(shù)據(jù)存儲(chǔ)表和所述對(duì)象標(biāo)記的標(biāo)識(shí),能夠識(shí)別對(duì)象與其它對(duì)象是否相同,并在反序列化時(shí)無(wú)需對(duì)同一對(duì)象多次反序列化。減少了內(nèi)存空間的消耗,提升了反序列化的速度。
實(shí)施例五
圖9是本發(fā)明實(shí)施例五提供的數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化裝置結(jié)構(gòu)示意圖,如圖9所示,所述裝置包括:
獲取模塊510,用于根據(jù)保存在數(shù)據(jù)字典中對(duì)象列的描述信息獲取對(duì)象列對(duì)應(yīng)的類(lèi)的登記信息;
生成模塊520,用于根據(jù)所述登記信息對(duì)實(shí)例數(shù)據(jù)實(shí)例化,以生成對(duì)象實(shí)例;
分配模塊530,用于在內(nèi)存中分配臨時(shí)數(shù)據(jù)存儲(chǔ)表;
轉(zhuǎn)換模塊540,用于通過(guò)所述臨時(shí)數(shù)據(jù)存儲(chǔ)表,按照預(yù)設(shè)的格式和登記信息將所述對(duì)象實(shí)例的屬性轉(zhuǎn)換為相應(yīng)的二進(jìn)制數(shù)據(jù);
存儲(chǔ)模塊550,用于將所述二進(jìn)制數(shù)據(jù)存儲(chǔ)在對(duì)象表中。
本發(fā)明實(shí)施例提供的數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化裝置,通過(guò)對(duì)象列中的類(lèi)的登記信息,對(duì)實(shí)例數(shù)據(jù)進(jìn)行實(shí)例化,以生成對(duì)象實(shí)例,并在內(nèi)存中分配臨時(shí)數(shù)據(jù)存儲(chǔ)表,按照預(yù)設(shè)的格式和登記信息將對(duì)象實(shí)例轉(zhuǎn)換為二進(jìn)制數(shù)據(jù),并將二進(jìn)制數(shù)據(jù)存儲(chǔ)在對(duì)象表中??梢圆捎枚M(jìn)制數(shù)據(jù)表達(dá)對(duì)象實(shí)例,無(wú)需增加數(shù)據(jù)類(lèi)型的種類(lèi)??梢暂^小代價(jià)實(shí)現(xiàn)對(duì)象類(lèi)型支持的擴(kuò)展,并可實(shí)現(xiàn)類(lèi)的插入、刪除和修改操作。減少了對(duì)新數(shù)據(jù)類(lèi)型的維護(hù)成本,大大簡(jiǎn)化了對(duì)象類(lèi)型在數(shù)據(jù)庫(kù)中的存儲(chǔ)邏輯。
在上述各實(shí)施例的基礎(chǔ)上,所述裝置還包括:
銷(xiāo)毀模塊,用于銷(xiāo)毀所述臨時(shí)數(shù)據(jù)存儲(chǔ)表,以釋放內(nèi)存。
在上述各實(shí)施例的基礎(chǔ)上,所述登記信息包括:
保存在數(shù)據(jù)字典中的類(lèi)唯一標(biāo)識(shí)符、類(lèi)名稱(chēng)和類(lèi)的創(chuàng)建語(yǔ)句;和
保存在內(nèi)存結(jié)構(gòu)中的類(lèi)唯一標(biāo)識(shí)符、類(lèi)名稱(chēng)、加密屬性、繼承屬性、類(lèi)的屬性和方法信息,所述方法信息包括方法中參數(shù)的名稱(chēng)、長(zhǎng)度、數(shù)據(jù)類(lèi)型和方法的調(diào)用指針。
在上述各實(shí)施例的基礎(chǔ)上,所述生成模塊用于:
根據(jù)類(lèi)名查找內(nèi)存結(jié)構(gòu)中構(gòu)造函數(shù)方法中構(gòu)造函數(shù)的指針,執(zhí)行構(gòu)造函數(shù),生成對(duì)象實(shí)例。
在上述各實(shí)施例的基礎(chǔ)上,所述轉(zhuǎn)換模塊,包括:
寫(xiě)入單元,用于向二進(jìn)制數(shù)據(jù)流寫(xiě)入是否為類(lèi)的標(biāo)識(shí)、類(lèi)標(biāo)識(shí)符、屬性個(gè)數(shù)和屬性值。
在上述各實(shí)施例的基礎(chǔ)上,所述寫(xiě)入單元用于:
在寫(xiě)入屬性為對(duì)象時(shí),判斷臨時(shí)數(shù)據(jù)存儲(chǔ)表中是否存在所述對(duì)象的唯一標(biāo)識(shí)符;
如果不存在所述對(duì)象的唯一標(biāo)識(shí)符,則在臨時(shí)數(shù)據(jù)存儲(chǔ)表中記錄所述對(duì)象的唯一標(biāo)識(shí)符,并生成所述對(duì)象標(biāo)記的標(biāo)識(shí),在二進(jìn)制數(shù)據(jù)流中寫(xiě)入未標(biāo)記標(biāo)識(shí)、所述對(duì)象的唯一標(biāo)識(shí)符、屬性個(gè)數(shù)和屬性值;
如果存在所述對(duì)象的唯一標(biāo)識(shí)符,則從所述臨時(shí)數(shù)據(jù)存儲(chǔ)表取出記錄的對(duì)象標(biāo)記的標(biāo)識(shí),在二進(jìn)制數(shù)據(jù)流中寫(xiě)入已標(biāo)記標(biāo)識(shí)和所述記錄的對(duì)象標(biāo)記的標(biāo)識(shí)。
在上述各實(shí)施例的基礎(chǔ)上,所述生成模塊包括:
生成子單元,用于根據(jù)所述內(nèi)存結(jié)構(gòu)中的構(gòu)造函數(shù)方法判斷調(diào)用構(gòu)造函數(shù)的參數(shù)是否正確,如果正確,則根據(jù)類(lèi)名查找內(nèi)存結(jié)構(gòu)中構(gòu)造函數(shù)方法中構(gòu)造函數(shù)的指針執(zhí)行構(gòu)造函數(shù),生成對(duì)象實(shí)例。
本發(fā)明實(shí)施例所提供數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化裝置可用于執(zhí)行本發(fā)明任意實(shí)施例提供的數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的序列化方法,具備相應(yīng)的功能模塊,實(shí)現(xiàn)相同的有益效果。
實(shí)施例六
圖10是本發(fā)明實(shí)施例六提供的數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的反序列化裝置的結(jié)構(gòu)示意圖,如圖10所示,所述裝置包括:
判斷模塊610,用于根據(jù)二進(jìn)制數(shù)據(jù)判斷是否為列對(duì)象序列化數(shù)據(jù);
分配模塊620,用于如果為列對(duì)象序列化數(shù)據(jù),在內(nèi)存中分配臨時(shí)數(shù)據(jù)存儲(chǔ)表;
確定模塊630,用于按照預(yù)設(shè)的格式確定對(duì)象對(duì)應(yīng)的類(lèi)唯一標(biāo)識(shí)符和類(lèi)的屬性個(gè)數(shù);
讀取模塊640,用于在臨時(shí)數(shù)據(jù)存儲(chǔ)表中寫(xiě)入屬性的屬性值,所述屬性的屬性值按照預(yù)設(shè)的格式讀取。
本實(shí)施例提供的數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的反序列化裝置,通過(guò)判斷根據(jù)預(yù)設(shè)的格式在臨時(shí)數(shù)據(jù)存儲(chǔ)表中讀取相應(yīng)的對(duì)象屬性和屬性信息,可以直接從序列化數(shù)據(jù)中直接獲取得到對(duì)象列的實(shí)例數(shù)據(jù)??梢栽谟脩?hù)查詢(xún)對(duì)象列時(shí),并可將類(lèi)對(duì)象數(shù)據(jù)返回給用戶(hù)。實(shí)現(xiàn)傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)支持對(duì)象列的查詢(xún)操作。
在上述各實(shí)施例的基礎(chǔ)上,所述裝置還包括:
銷(xiāo)毀模塊,用于將所述寫(xiě)的屬性的屬性值存入內(nèi)存結(jié)構(gòu)中,并銷(xiāo)毀所述臨時(shí)數(shù)據(jù)存儲(chǔ)表;或在查詢(xún)操作結(jié)束時(shí),銷(xiāo)毀所述臨時(shí)數(shù)據(jù)存儲(chǔ)表。
在上述各實(shí)施例的基礎(chǔ)上,所述讀取模塊用于:
根據(jù)屬性值中是否為類(lèi)的標(biāo)識(shí)判斷屬性是否為類(lèi)類(lèi)型,如果為類(lèi)類(lèi)型,則讀取所述對(duì)象是否已標(biāo)記的標(biāo)識(shí);
如果所述對(duì)象是否已標(biāo)記的標(biāo)識(shí)為未標(biāo)記標(biāo)識(shí),則生成所述對(duì)象的唯一標(biāo)識(shí)符和對(duì)象標(biāo)記的標(biāo)識(shí),并從所述二進(jìn)制數(shù)據(jù)中讀取所述屬性中類(lèi)類(lèi)型的類(lèi)唯一標(biāo)識(shí)符、屬性個(gè)數(shù)和屬性值,并將所述類(lèi)唯一標(biāo)識(shí)符、屬性個(gè)數(shù)和屬性值存入單元格式中,并將所述單元格式的指針寫(xiě)入對(duì)應(yīng)的屬性值中;
如果所述對(duì)象是否已標(biāo)記的標(biāo)識(shí)為已標(biāo)記標(biāo)識(shí),根據(jù)所述對(duì)象標(biāo)記的標(biāo)識(shí)查找對(duì)應(yīng)的對(duì)象唯一標(biāo)識(shí)符,并通過(guò)所述唯一標(biāo)識(shí)符確定對(duì)應(yīng)的單元格式,將指向所述單元格式的指針寫(xiě)入屬性值中。
本發(fā)明實(shí)施例所提供數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的反序列化裝置可用于執(zhí)行本發(fā)明任意實(shí)施例提供的數(shù)據(jù)庫(kù)中對(duì)象類(lèi)型列的反序列化方法,具備相應(yīng)的功能模塊,實(shí)現(xiàn)相同的有益效果。
顯然,本領(lǐng)域技術(shù)人員應(yīng)該明白,上述本發(fā)明的各模塊或各步驟可以通過(guò)如上所述的設(shè)備實(shí)施??蛇x地,本發(fā)明實(shí)施例可以用計(jì)算機(jī)裝置可執(zhí)行的程序來(lái)實(shí)現(xiàn),從而可以將它們存儲(chǔ)在存儲(chǔ)裝置中由處理器來(lái)執(zhí)行,所述的程序可以存儲(chǔ)于一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中,上述提到的存儲(chǔ)介質(zhì)可以是只讀存儲(chǔ)器,磁盤(pán)或光盤(pán)等;或者將它們分別制作成各個(gè)集成電路模塊,或者將它們中的多個(gè)模塊或步驟制作成單個(gè)集成電路模塊來(lái)實(shí)現(xiàn)。這樣,本發(fā)明不限制于任何特定的硬件和軟件的結(jié)合。注意,上述僅為本發(fā)明的較佳實(shí)施例及所運(yùn)用技術(shù)原理。本領(lǐng)域技術(shù)人員會(huì)理解,本發(fā)明不限于這里所述的特定實(shí)施例,對(duì)本領(lǐng)域技術(shù)人員來(lái)說(shuō)能夠進(jìn)行各種明顯的變化、重新調(diào)整和替代而不會(huì)脫離本發(fā)明的保護(hù)范圍。因此,雖然通過(guò)以上實(shí)施例對(duì)本發(fā)明進(jìn)行了較為詳細(xì)的說(shuō)明,但是本發(fā)明不僅僅限于以上實(shí)施例,在不脫離本發(fā)明構(gòu)思的情況下,還可以包括更多其他等效實(shí)施例,而本發(fā)明的范圍由所附的權(quán)利要求范圍決定。