本申請(qǐng)涉及計(jì)算機(jī)應(yīng)用技術(shù)領(lǐng)域,尤其涉及一種數(shù)據(jù)對(duì)象序列化和反序列化數(shù)據(jù)對(duì)象的方法及裝置。
背景技術(shù):
序列化(Serialization)是將對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问降倪^(guò)程。在序列化期間,對(duì)象將其當(dāng)前狀態(tài)寫(xiě)入到臨時(shí)或持久性存儲(chǔ)區(qū)。以后,可以通過(guò)從存儲(chǔ)區(qū)中讀取或反序列化對(duì)象的狀態(tài),重新創(chuàng)建該對(duì)象。
傳統(tǒng)的序列化方法有:JavaBuildIn、hessian、xml、Json等,其中,JavaBuildIn、hessian是基于二進(jìn)制的序列化方法,序列化出來(lái)的數(shù)據(jù)是不可讀的。xml是基于文本的序列化方法,但是由于xml的結(jié)構(gòu)特性,序列化出來(lái)的文本數(shù)據(jù)結(jié)構(gòu)繁鎖,冗余嚴(yán)重。
相對(duì)而言,目前較為常用的Json序列化方法是基于JavaScript語(yǔ)法的一種格式,將數(shù)據(jù)對(duì)象表示成由{、}、[、]等符號(hào)來(lái)表達(dá)層次關(guān)系,字段名與值之間通過(guò)冒號(hào)“:”分隔的一種文本序列化方法。傳統(tǒng)的Json格式序列化方法生成的文本格式特點(diǎn)是數(shù)據(jù)的層次結(jié)構(gòu)比較復(fù)雜。因此,在一些不能進(jìn)行反序列化,只能直接訪(fǎng)問(wèn)文本格式的場(chǎng)景下(如:存儲(chǔ)在數(shù)據(jù)庫(kù)的字段中時(shí)),由于Json格式是一個(gè)大文本串,要找出其中某部分文本數(shù)據(jù)所在的位置是比較困難的。此外,如果需要將某部分文本內(nèi)容修改為其它內(nèi)容時(shí),將會(huì)更加難以實(shí)現(xiàn)。
技術(shù)實(shí)現(xiàn)要素:
本申請(qǐng)實(shí)施例提供一種數(shù)據(jù)對(duì)象序列化和反序列化數(shù)據(jù)對(duì)象的方法及裝置,能夠簡(jiǎn)化數(shù)據(jù)對(duì)象描述的層次結(jié)構(gòu),提高對(duì)數(shù)據(jù)查詢(xún)、修改的效率。
一種數(shù)據(jù)對(duì)象序列化方法,包括:
獲取數(shù)據(jù)對(duì)象;
將所述數(shù)據(jù)對(duì)象作為參數(shù),調(diào)用序列化函數(shù),獲取所述數(shù)據(jù)對(duì)象中包括的根屬性;
根據(jù)所述根屬性在所述數(shù)據(jù)對(duì)象中的位置,生成文本路徑;
獲取所述根屬性對(duì)應(yīng)的屬性值對(duì)象,將所述屬性值對(duì)象轉(zhuǎn)換為文本值;
將對(duì)應(yīng)相同所述根屬性的所述文本路徑和所述文本值通過(guò)等號(hào)相連形成屬性值對(duì)的文本格式,生成各個(gè)所述根屬性的序列化結(jié)果。
進(jìn)一步,所述獲取所述數(shù)據(jù)對(duì)象中包括的根屬性,包括:
獲取所述數(shù)據(jù)對(duì)象的屬性;
獲取所述屬性的類(lèi);
根據(jù)所述類(lèi),確定所述屬性是否為所述根屬性類(lèi)型。
進(jìn)一步,還包括:
當(dāng)確定所述屬性為具有層級(jí)關(guān)系的非根屬性時(shí),將所述非根屬性序列化為根屬性。
進(jìn)一步,所述將所述非根屬性序列化為根屬性,包括:
將所述非根屬性的屬性值對(duì)象作為參數(shù),調(diào)用所述序列化函數(shù),對(duì)所述非根屬性的屬性值對(duì)象進(jìn)行序列化。
一種反序列化數(shù)據(jù)對(duì)象方法,包括:
獲取已被序列化為文本路徑和文本值通過(guò)等號(hào)相連形成的屬性值對(duì)文本;
將所述屬性值對(duì)文本和反序列化后的目標(biāo)類(lèi)作為參數(shù),調(diào)用反序列化函數(shù),創(chuàng)建符合所述目標(biāo)類(lèi)的空對(duì)象,所述空對(duì)象中的屬性值為空;
遍歷所述屬性值對(duì)文本,獲取所述屬性值對(duì)文本中的根屬性;
獲取所述根屬性對(duì)應(yīng)的文本值;
將所述根屬性對(duì)應(yīng)的文本值轉(zhuǎn)換為所述目標(biāo)類(lèi)中對(duì)應(yīng)所述根屬性的類(lèi)型,并賦值給所述空對(duì)象中的所述根屬性。
進(jìn)一步,還包括:
判斷所述屬性值對(duì)文本中是否存在與所述根屬性具有相同路徑前綴的屬性;
如果存在與所述根屬性具有相同路徑前綴的屬性,則確定所述根屬性下具有下級(jí)非根屬性;
調(diào)用所述反序列化函數(shù),創(chuàng)建符合所述根屬性對(duì)應(yīng)類(lèi)的空對(duì)象;
遍歷對(duì)應(yīng)所述下級(jí)非根屬性的屬性值對(duì)文本,獲取所述下級(jí)非根屬性;
獲取所述下級(jí)非根屬性對(duì)應(yīng)的文本值,將所述下級(jí)非根屬性對(duì)應(yīng)的文本值轉(zhuǎn)換為所述下級(jí)非根屬性的類(lèi)型,并賦值給所述根屬性對(duì)應(yīng)類(lèi)的空對(duì)象中的所述下級(jí)非根屬性。
一種數(shù)據(jù)對(duì)象序列化裝置,包括:
數(shù)據(jù)對(duì)象獲取模塊,用于獲取數(shù)據(jù)對(duì)象;
根屬性獲取模塊,用于將所述數(shù)據(jù)對(duì)象作為參數(shù),調(diào)用序列化函數(shù),獲取所述數(shù)據(jù)對(duì) 象中包括的根屬性;
根屬性文本路徑生成模塊,用于根據(jù)所述根屬性在所述數(shù)據(jù)對(duì)象中的位置,生成文本路徑;
根屬性文本值獲取模塊,用于獲取所述根屬性對(duì)應(yīng)的屬性值對(duì)象,將所述屬性值對(duì)象轉(zhuǎn)換為文本值;
根屬性屬性值對(duì)生成模塊,用于將對(duì)應(yīng)相同所述根屬性的所述文本路徑和所述文本值通過(guò)等號(hào)相連形成屬性值對(duì)的文本格式,生成各個(gè)所述根屬性的序列化結(jié)果。
進(jìn)一步,所述根屬性獲取模塊,包括:
屬性獲取單元,用于獲取所述數(shù)據(jù)對(duì)象的屬性;
類(lèi)獲取單元,用于獲取所述屬性的類(lèi);
屬性類(lèi)型確定單元,用于根據(jù)所述類(lèi),確定所述屬性是否為所述根屬性類(lèi)型。
進(jìn)一步,還包括:
非根屬性序列化模塊,用于當(dāng)確定所述屬性為具有層級(jí)關(guān)系的非根屬性時(shí),將所述非根屬性序列化為根屬性。
進(jìn)一步,所述非根屬性序列化模塊,具體將所述非根屬性的屬性值對(duì)象作為參數(shù),調(diào)用所述序列化函數(shù),對(duì)所述非根屬性的屬性值對(duì)象進(jìn)行序列化。
一種反序列化數(shù)據(jù)對(duì)象裝置,包括:
屬性值對(duì)文本獲取模塊,用于獲取已被序列化為文本路徑和文本值通過(guò)等號(hào)相連形成的屬性值對(duì)文本;
第一空對(duì)象創(chuàng)建模塊,用于將所述屬性值對(duì)文本和反序列化后的目標(biāo)類(lèi)作為參數(shù),調(diào)用反序列化函數(shù),創(chuàng)建符合所述目標(biāo)類(lèi)的空對(duì)象,所述空對(duì)象中的屬性值為空;
根屬性獲取模塊,用于遍歷所述屬性值對(duì)文本,獲取所述屬性值對(duì)文本中的根屬性;
根屬性文本值獲取模塊,用于獲取所述根屬性對(duì)應(yīng)的文本值;
根屬性文本值轉(zhuǎn)換模塊,用于將所述根屬性對(duì)應(yīng)的文本值轉(zhuǎn)換為所述目標(biāo)類(lèi)中對(duì)應(yīng)所述根屬性的類(lèi)型,并賦值給所述空對(duì)象中的所述根屬性。
進(jìn)一步,還包括:
路徑判斷模塊,用于判斷所述屬性值對(duì)文本中是否存在與所述根屬性具有相同路徑前綴的屬性;
屬性確定模塊,用于如果存在與所述根屬性具有相同路徑前綴的屬性,則確定所述根屬性下具有下級(jí)非根屬性;
第二空對(duì)象創(chuàng)建模塊,用于調(diào)用所述反序列化函數(shù),創(chuàng)建符合所述根屬性對(duì)應(yīng)類(lèi)的空對(duì)象;
非根屬性獲取模塊,用于遍歷對(duì)應(yīng)所述下級(jí)非根屬性的屬性值對(duì)文本,獲取所述下級(jí)非根屬性;
非根屬性文本值獲取模塊,用于獲取所述下級(jí)非根屬性對(duì)應(yīng)的文本值;
非根屬性文本值轉(zhuǎn)換模塊,用于將所述下級(jí)非根屬性對(duì)應(yīng)的文本值轉(zhuǎn)換為所述下級(jí)非根屬性的類(lèi)型,并賦值給所述根屬性對(duì)應(yīng)類(lèi)的空對(duì)象中的所述下級(jí)非根屬性。
本申請(qǐng)實(shí)施例中,通過(guò)序列化,獲取數(shù)據(jù)對(duì)象中包括的根屬性,根據(jù)根屬性在數(shù)據(jù)對(duì)象中的位置,生成文本路徑,同時(shí),獲取根屬性對(duì)應(yīng)的屬性值對(duì)象,將屬性值對(duì)象轉(zhuǎn)換為文本值,從而,將復(fù)雜的數(shù)據(jù)對(duì)象中的每個(gè)根屬性的描述轉(zhuǎn)換為簡(jiǎn)單的屬性值對(duì)的文本形式,其中,每個(gè)屬性值對(duì)中,一邊為根屬性在數(shù)據(jù)對(duì)象中的文本路徑,另一邊為根屬性屬性值對(duì)應(yīng)的文本值,文本路徑和文本值通過(guò)等號(hào)相連。由此,大大簡(jiǎn)化數(shù)據(jù)對(duì)象描述中的層次結(jié)構(gòu)和值關(guān)系,從而能夠解決傳統(tǒng)序列化方法中層次結(jié)構(gòu)復(fù)雜及直接訪(fǎng)問(wèn)文本格式場(chǎng)景下查詢(xún)和修改文本內(nèi)容困難的問(wèn)題,提高對(duì)數(shù)據(jù)查詢(xún)、修改的效率,使得數(shù)據(jù)對(duì)象更易維護(hù)。
附圖說(shuō)明
此處所說(shuō)明的附圖用來(lái)提供對(duì)本申請(qǐng)的進(jìn)一步理解,構(gòu)成本申請(qǐng)的一部分,本申請(qǐng)的示意性實(shí)施例及其說(shuō)明用于解釋本申請(qǐng),并不構(gòu)成對(duì)本申請(qǐng)的不當(dāng)限定。在附圖中:
圖1為本申請(qǐng)實(shí)施例中一種數(shù)據(jù)對(duì)象序列化方法的流程圖;
圖2為本申請(qǐng)實(shí)施例中類(lèi)的示意圖;
圖3為對(duì)應(yīng)圖2中類(lèi)的類(lèi)對(duì)象示意圖;
圖4為圖3中的類(lèi)對(duì)象在內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)示意圖;
圖5為本申請(qǐng)實(shí)施例中屬性值對(duì)的示意圖;
圖6為圖1中步驟102的實(shí)現(xiàn)流程示意圖;
圖7為在圖3所示的應(yīng)用場(chǎng)景下,數(shù)據(jù)對(duì)象序列化的整體流程示意圖;
圖8為本申請(qǐng)實(shí)施例中序列化結(jié)果的示意圖;
圖9為本申請(qǐng)實(shí)施例中一種反序列化數(shù)據(jù)對(duì)象方法的流程圖;
圖10為本申請(qǐng)實(shí)施例中另一種反序列化數(shù)據(jù)對(duì)象方法的流程圖;
圖11為以圖8所示序列化結(jié)果為例,反序列化數(shù)據(jù)對(duì)象方法的流程圖;
圖12為本申請(qǐng)實(shí)施例中一種數(shù)據(jù)對(duì)象序列化裝置的結(jié)構(gòu)示意圖;
圖13為圖12中根屬性獲取模塊的結(jié)構(gòu)示意圖;
圖14為本申請(qǐng)實(shí)施例中另一種數(shù)據(jù)對(duì)象序列化裝置的結(jié)構(gòu)示意圖;
圖15為本申請(qǐng)實(shí)施例中一種反序列化數(shù)據(jù)對(duì)象裝置的結(jié)構(gòu)示意圖;
圖16為本申請(qǐng)實(shí)施例中另一種反序列化數(shù)據(jù)對(duì)象裝置的結(jié)構(gòu)示意圖
具體實(shí)施方式
為了使本申請(qǐng)所要解決的技術(shù)問(wèn)題、技術(shù)方案及有益效果更加清楚、明白,以下結(jié)合附圖和實(shí)施例,對(duì)本申請(qǐng)進(jìn)行進(jìn)一步詳細(xì)說(shuō)明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本申請(qǐng),并不用于限定本申請(qǐng)。
本申請(qǐng)實(shí)施例提供的一種數(shù)據(jù)對(duì)象序列化方法,能夠簡(jiǎn)化數(shù)據(jù)對(duì)象描述的層次結(jié)構(gòu),提高對(duì)數(shù)據(jù)查詢(xún)、修改的效率。
在圖1所述的實(shí)施例中,該數(shù)據(jù)對(duì)象序列化方法具體包括:
步驟101、獲取數(shù)據(jù)對(duì)象。
該步驟中,在進(jìn)行數(shù)據(jù)對(duì)象序列化之前,需要首先獲取該數(shù)據(jù)對(duì)象。
本發(fā)明實(shí)施例中,數(shù)據(jù)對(duì)象通常為類(lèi)對(duì)象。例如:針對(duì)圖2所示的類(lèi),通常會(huì)創(chuàng)建一個(gè)類(lèi)對(duì)象,如圖3所示,其中,創(chuàng)建出的類(lèi)對(duì)象名為“test”,針對(duì)該test對(duì)象,會(huì)在內(nèi)存中為其開(kāi)辟相應(yīng)的空間,該test對(duì)象在內(nèi)存中會(huì)形成如圖4所示的數(shù)據(jù)結(jié)構(gòu)。
步驟102、將數(shù)據(jù)對(duì)象作為參數(shù),調(diào)用序列化函數(shù),獲取數(shù)據(jù)對(duì)象中包括的根屬性。
該步驟中,將數(shù)據(jù)對(duì)象作為參數(shù),調(diào)用序列化函數(shù),開(kāi)始對(duì)該數(shù)據(jù)對(duì)象進(jìn)行序列化。首先,序列化函數(shù)會(huì)通過(guò)反射技術(shù),獲取數(shù)據(jù)對(duì)象中包括的根屬性。例如:序列化函數(shù)通過(guò)反射技術(shù),會(huì)獲取圖3所示的test對(duì)象中的根屬性:name和postDate。
需要說(shuō)明的是,本申請(qǐng)所述的“根屬性”是指:數(shù)據(jù)對(duì)象最末級(jí)的屬性,也可以稱(chēng)之為“葉子屬性”。根屬性的數(shù)據(jù)類(lèi)型可以為簡(jiǎn)單類(lèi)型,簡(jiǎn)單類(lèi)型是指如下類(lèi)型中的任意一種:int、char、long、boolean、byte、double、float、short、Integer、Character、Long、Boolean、Byte、Double、Float、Short、Enum、Date、Class。
為了描述簡(jiǎn)便,將本發(fā)明實(shí)施例中的序列化方法取名為Prop,后面提到該序列化方法 時(shí)都用Prop代替。
步驟103、根據(jù)根屬性在數(shù)據(jù)對(duì)象中的位置,生成文本路徑。
該步驟中,根據(jù)當(dāng)前屬性的所在位置,生成相應(yīng)的文本路徑。例如:圖3所示的test對(duì)象中,根屬性name的路徑為test.name,根屬性postDate的路徑為test.postDate。關(guān)于文本路徑的生成規(guī)范將在后面通過(guò)專(zhuān)門(mén)表格進(jìn)行說(shuō)明。
步驟104、獲取根屬性對(duì)應(yīng)的屬性值對(duì)象,將屬性值對(duì)象轉(zhuǎn)換為文本值。
該步驟中,繼續(xù)從數(shù)據(jù)對(duì)象中獲取根屬性對(duì)應(yīng)的屬性值對(duì)象,并且,需要將屬性值對(duì)象轉(zhuǎn)換為相應(yīng)的文本值。例如:圖3所示的test對(duì)象中,根屬性name的屬性值“名稱(chēng)”本身就是文本,因此不需進(jìn)行文本轉(zhuǎn)換;根屬性postDate的屬性值對(duì)象是一個(gè)Date類(lèi)型的對(duì)象,序列化后的Prop文本為“2014-09-02 12:00:01”。將屬性值對(duì)象轉(zhuǎn)換為文本值的規(guī)范也將在后面通過(guò)專(zhuān)門(mén)表格進(jìn)行說(shuō)明。
步驟105、將對(duì)應(yīng)相同根屬性的文本路徑和文本值通過(guò)等號(hào)相連形成屬性值對(duì)的文本格式,生成各個(gè)根屬性的序列化結(jié)果。
該步驟中,將相同的根屬性對(duì)應(yīng)的文本路徑和文本值通過(guò)等號(hào)“=”連接,形成屬性值對(duì)的文本形式,通常,為了使得屬性值對(duì)文本數(shù)據(jù)結(jié)構(gòu)更加簡(jiǎn)單,每個(gè)根屬性對(duì)應(yīng)的屬性值對(duì)占用一行。例如:如圖5所示,圖3所示的test對(duì)象中,根屬性name對(duì)應(yīng)的屬性值對(duì)文本為:test.name=名稱(chēng);根屬性postDate對(duì)應(yīng)的屬性值對(duì)文本為:test.postDate=2014-09-02 12:00:01。至此,完成對(duì)各個(gè)根屬性的序列化。
本申請(qǐng)實(shí)施例中,通過(guò)序列化,獲取數(shù)據(jù)對(duì)象中包括的根屬性,根據(jù)根屬性在數(shù)據(jù)對(duì)象中的位置,生成文本路徑,同時(shí),獲取根屬性對(duì)應(yīng)的屬性值對(duì)象,將屬性值對(duì)象轉(zhuǎn)換為文本值,從而,將復(fù)雜的數(shù)據(jù)對(duì)象中的每個(gè)根屬性的描述轉(zhuǎn)換為簡(jiǎn)單的屬性值對(duì)的文本形式,其中,每個(gè)屬性值對(duì)中,一邊為根屬性在數(shù)據(jù)對(duì)象中的文本路徑,另一邊為根屬性屬性值對(duì)應(yīng)的文本值,文本路徑和文本值通過(guò)等號(hào)相連。由此,大大簡(jiǎn)化數(shù)據(jù)對(duì)象描述中的層次結(jié)構(gòu)和值關(guān)系,從而能夠解決傳統(tǒng)序列化方法中層次結(jié)構(gòu)復(fù)雜及直接訪(fǎng)問(wèn)文本格式場(chǎng)景下查詢(xún)和修改文本內(nèi)容困難的問(wèn)題,提高對(duì)數(shù)據(jù)查詢(xún)、修改的效率,使得數(shù)據(jù)對(duì)象更易維護(hù)。
為了便于對(duì)本申請(qǐng)技術(shù)方案的理解,下面通過(guò)具體實(shí)施例,對(duì)相關(guān)技術(shù)實(shí)現(xiàn)過(guò)程進(jìn)行進(jìn)一步的解釋說(shuō)明。
在本申請(qǐng)?zhí)峁┑囊粋€(gè)實(shí)施例中,上述步驟102中,獲取數(shù)據(jù)對(duì)象中包括的根屬性的方法流程如圖6所示,具體包括:
步驟601、獲取數(shù)據(jù)對(duì)象的屬性;
步驟602、獲取屬性的類(lèi)(class);
步驟603、根據(jù)類(lèi),確定屬性是否為根屬性類(lèi)型。
該實(shí)施例示出了確定數(shù)據(jù)對(duì)象中根屬性的方式,具體為,根據(jù)數(shù)據(jù)對(duì)象包含各個(gè)屬性所屬的類(lèi),確定該屬性是否為根屬性。對(duì)應(yīng)根屬性,不需要通過(guò)迭代進(jìn)行屬性的序列化。
相應(yīng)地,如果根據(jù)數(shù)據(jù)對(duì)象包含各個(gè)屬性所屬的類(lèi),確定該屬性為非根屬性,即:當(dāng)前屬性包括其他的下級(jí)子屬性。例如:圖3所示的test對(duì)象中,屬性offers即為非根屬性,其下還包括下級(jí)屬性elementData。
對(duì)于非根屬性,需要將其序列化為根屬性,具體地,將非根屬性的屬性值對(duì)象作為參數(shù),調(diào)用序列化函數(shù),對(duì)非根屬性的屬性值對(duì)象進(jìn)行序列化。
下面以圖3所示的test對(duì)象為例,對(duì)前述數(shù)據(jù)對(duì)象序列化的整體流程進(jìn)行完整的說(shuō)明,完整的流程如圖7所示,具體可以包括以下步驟:
步驟701、傳入數(shù)據(jù)對(duì)象test;
步驟702、將數(shù)據(jù)對(duì)象test做為參數(shù),調(diào)用序列化函數(shù),獲取數(shù)據(jù)對(duì)象test中包括的三個(gè)屬性:name、postDate和offers。
步驟703、遍歷上一步獲得的屬性,獲取每一個(gè)屬性的類(lèi)(class)。
步驟704、根據(jù)各個(gè)屬性的class,判斷相應(yīng)屬性是否為根屬性;如果存在非根屬性,則繼續(xù)步驟705;如果為根屬性,則繼續(xù)步驟706;
步驟705、對(duì)當(dāng)前非根屬性的屬性值對(duì)象通過(guò)迭代進(jìn)行序列化,將非根屬性序列化為根屬性;之后,轉(zhuǎn)入執(zhí)行步驟706;
步驟706、根據(jù)根屬性在數(shù)據(jù)對(duì)象中的位置,生成文本路徑;
步驟707、將根屬性對(duì)應(yīng)的屬性值對(duì)象轉(zhuǎn)換為文本值;
步驟708、將對(duì)應(yīng)相同根屬性的文本路徑和文本值通過(guò)“=”相連,形成屬性值對(duì)的文本格式;
步驟709、判斷是否還有同級(jí)屬性未序列化;如果有,則轉(zhuǎn)入執(zhí)行步驟703;如果無(wú),則繼續(xù)執(zhí)行步驟710;
步驟710、輸出數(shù)據(jù)對(duì)象中所有屬性的序列化結(jié)果。
其中,部分序列化結(jié)果如圖8所示??梢?jiàn),序列化后的文本數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單,一行文本表示一個(gè)屬性,每行文本中等號(hào)前面的是屬性在數(shù)據(jù)對(duì)象中的位置路徑,位置的層次關(guān)系通過(guò)點(diǎn)號(hào)“.”相連,如:“test.name=名稱(chēng)”這一行,其中,“名稱(chēng)”是name屬性的屬性值; “test.name”是name屬性在數(shù)據(jù)對(duì)象中的路徑,由于name是數(shù)據(jù)對(duì)象test的屬性,所以用“.”號(hào)連接在test后面,用來(lái)表示層級(jí)關(guān)系。
考慮到數(shù)據(jù)對(duì)象中字段類(lèi)型的多樣性,本申請(qǐng)對(duì)文本路徑的格式做了如下規(guī)范要求:
表1 文本路徑格式規(guī)范
此外,考慮到數(shù)據(jù)對(duì)象中字段值類(lèi)型的多樣性,對(duì)字段值的字段串格式也制定了一些規(guī)范要求,如下表:
表2 文本值規(guī)范
相應(yīng)上述數(shù)據(jù)對(duì)象序列化方法,本申請(qǐng)還相應(yīng)提供了一種反序列化數(shù)據(jù)對(duì)象方法,可以將序列化后的屬性值對(duì)文本對(duì)象快速轉(zhuǎn)換為數(shù)據(jù)對(duì)象。
如圖9所示的實(shí)施例中,反序列化數(shù)據(jù)對(duì)象方法具體可以包括:
步驟901、獲取已被序列化為文本路徑和文本值通過(guò)等號(hào)相連形成的屬性值對(duì)文本。
本發(fā)明實(shí)施例中,進(jìn)行反序列化的對(duì)象為:已經(jīng)序列化為屬性值對(duì)的文本對(duì)象,該文本對(duì)象包括:通過(guò)等號(hào)相連的文本路徑和文本值,其中,文本路徑對(duì)應(yīng)反序列化之后的數(shù)據(jù)對(duì)象中根屬性在其中的位置,文本值對(duì)應(yīng)根屬性對(duì)應(yīng)的屬性值對(duì)象。
步驟902、將屬性值對(duì)文本和反序列化后的目標(biāo)類(lèi)作為參數(shù),調(diào)用反序列化函數(shù),創(chuàng)建符合目標(biāo)類(lèi)的空對(duì)象,空對(duì)象中的屬性值為空。
該步驟中,首先需要?jiǎng)?chuàng)建符合反序列化后的數(shù)據(jù)對(duì)象所屬類(lèi)的空對(duì)象,具體的創(chuàng)建方式為:將屬性值對(duì)文本和反序列化后的目標(biāo)類(lèi)作為參數(shù),調(diào)用反序列化函數(shù),創(chuàng)建一個(gè)空對(duì)象,空對(duì)象中的屬性值為空。
步驟903、遍歷屬性值對(duì)文本,獲取屬性值對(duì)文本中的根屬性。
該步驟中,當(dāng)創(chuàng)建空對(duì)象之后,需要繼續(xù)遍歷屬性值對(duì)文本,以獲取屬性值對(duì)文本中的根屬性。
步驟904、獲取根屬性對(duì)應(yīng)的文本值。
該步驟中,當(dāng)獲取到屬性值對(duì)文本中的根屬性之后,便可以進(jìn)一步獲取屬性值對(duì)文本中的根屬性對(duì)應(yīng)的文本值。
步驟905、將根屬性對(duì)應(yīng)的文本值轉(zhuǎn)換為目標(biāo)類(lèi)中對(duì)應(yīng)根屬性的類(lèi)型,并賦值給空對(duì)象中的根屬性。
該步驟中,將獲取到的根屬性對(duì)應(yīng)的文本值轉(zhuǎn)換為目標(biāo)類(lèi)中對(duì)應(yīng)根屬性的類(lèi)型,并通過(guò)賦值操作,對(duì)前述空對(duì)象中的根屬性進(jìn)行賦值,從而,完成將序列化后的屬性值對(duì)文本對(duì)象轉(zhuǎn)換為數(shù)據(jù)對(duì)象。
該實(shí)施例中,將文本值轉(zhuǎn)換為特定類(lèi)型的過(guò)程是前述序列化中的轉(zhuǎn)換過(guò)程的逆過(guò)程,此處不再進(jìn)行贅述。
由于在序列化后的屬性值對(duì)文本對(duì)象中,除了根屬性之外,還可能存在非根屬性,非根屬性與其所屬的根屬性的區(qū)別在于:二者的文本路徑具有相同的路徑前綴,例如:屬性offers對(duì)應(yīng)的文本路徑是test.offers,屬性值對(duì)文本test.offers.[0].status=NEW中的文本路徑為:test.offers.[0].status,可見(jiàn),兩個(gè)文本路徑具有相同的路徑前綴,因此,屬性status是屬性offers的下級(jí)屬性,需要對(duì)這類(lèi)非根屬性進(jìn)行迭代處理。對(duì)應(yīng)該種情形,在本申請(qǐng)的另一個(gè)實(shí)施例中,如圖10所示,還可以包括以下執(zhí)行步驟:
步驟906、判斷屬性值對(duì)文本中是否存在與根屬性具有相同路徑前綴的屬性,如果存在與根屬性具有相同路徑前綴的屬性,則執(zhí)行步驟907;
步驟907、確定根屬性下具有下級(jí)非根屬性;
步驟908、調(diào)用反序列化函數(shù),創(chuàng)建符合根屬性對(duì)應(yīng)類(lèi)的空對(duì)象;
步驟909、遍歷對(duì)應(yīng)下級(jí)非根屬性的屬性值對(duì)文本,獲取下級(jí)非根屬性;
步驟910、獲取下級(jí)非根屬性對(duì)應(yīng)的文本值,將下級(jí)非根屬性對(duì)應(yīng)的文本值轉(zhuǎn)換為下級(jí)非根屬性的類(lèi)型,并賦值給根屬性對(duì)應(yīng)類(lèi)的空對(duì)象中的下級(jí)非根屬性。
通過(guò)上述迭代處理,獲得屬性值對(duì)文本中存在的非根屬性的所有下級(jí)屬性,并對(duì)所有下級(jí)屬性進(jìn)行文本值轉(zhuǎn)換,實(shí)現(xiàn)對(duì)數(shù)據(jù)對(duì)象中的相應(yīng)下級(jí)非根屬性進(jìn)行賦值。
為了便于理解,下面以圖8所示的屬性值對(duì)文本為例,對(duì)前述反序列化的整體流程進(jìn)行完整的說(shuō)明,完整的流程如圖11所示,具體可以包括以下步驟:
步驟1101、傳入Prop文本,即:多行屬性值對(duì)文本;
步驟1102、將屬性值對(duì)文本和反序列化后的目標(biāo)類(lèi)作為參數(shù),調(diào)用反序列化函數(shù),創(chuàng)建符合目標(biāo)類(lèi)的空對(duì)象;
步驟1103、遍歷屬性值對(duì)文本;
步驟1104、通過(guò)反射獲取空對(duì)象的各個(gè)屬性;
步驟1105、查詢(xún)屬性值對(duì)文本中的根屬性;
步驟1106、判斷是否獲取相應(yīng)的根屬性,如果是,則繼續(xù)步驟1107;否則,轉(zhuǎn)入執(zhí)行步驟1103;
步驟1107、判斷是否存在非根屬性;如果是,則繼續(xù)步驟1109;否則,繼續(xù)執(zhí)行步驟1108;
步驟1108、將根屬性對(duì)應(yīng)的文本值轉(zhuǎn)換為目標(biāo)類(lèi)中對(duì)應(yīng)根屬性的類(lèi)型,并賦值給空對(duì)象中的根屬性;
步驟1109、調(diào)用反序列化函數(shù),創(chuàng)建符合根屬性對(duì)應(yīng)類(lèi)的空對(duì)象;
步驟1110、迭代獲取下級(jí)非根屬性;
步驟1111、將下級(jí)非根屬性對(duì)應(yīng)的文本值轉(zhuǎn)換為下級(jí)非根屬性的類(lèi)型,并賦值給根屬性對(duì)應(yīng)類(lèi)的空對(duì)象中的下級(jí)非根屬性。
基于同一發(fā)明構(gòu)思,本申請(qǐng)實(shí)施例還提供的一種數(shù)據(jù)對(duì)象序列化裝置,該裝置的結(jié)構(gòu)如圖12所示,包括:
數(shù)據(jù)對(duì)象獲取模塊1201,用于獲取數(shù)據(jù)對(duì)象;
根屬性獲取模塊1202,用于將數(shù)據(jù)對(duì)象作為參數(shù),調(diào)用序列化函數(shù),獲取數(shù)據(jù)對(duì)象中包括的根屬性;
根屬性文本路徑生成模塊1203,用于根據(jù)根屬性在數(shù)據(jù)對(duì)象中的位置,生成文本路徑;
根屬性文本值獲取模塊1204,用于獲取根屬性對(duì)應(yīng)的屬性值對(duì)象,將屬性值對(duì)象轉(zhuǎn)換為文本值;
根屬性屬性值對(duì)生成模塊1205,用于將對(duì)應(yīng)相同根屬性的文本路徑和文本值通過(guò)等號(hào)相連形成屬性值對(duì)的文本格式,生成各個(gè)根屬性的序列化結(jié)果。
在實(shí)際應(yīng)用場(chǎng)景中,如圖13所示,上述根屬性獲取模塊,具體可以包括:
屬性獲取單元1301,用于獲取數(shù)據(jù)對(duì)象的屬性;
類(lèi)獲取單元1302,用于獲取屬性的類(lèi);
屬性類(lèi)型確定單元1303,用于根據(jù)類(lèi),確定屬性是否為根屬性類(lèi)型。
在本申請(qǐng)的另一個(gè)數(shù)據(jù)對(duì)象序列化裝置實(shí)施例中,如圖14所示,還可以包括:
非根屬性序列化模塊1206,用于當(dāng)確定屬性為具有層級(jí)關(guān)系的非根屬性時(shí),將非根屬性序列化為根屬性。
具體地,上述非根屬性序列化模塊,可以將非根屬性的屬性值對(duì)象作為參數(shù),調(diào)用序列化函數(shù),對(duì)非根屬性的屬性值對(duì)象進(jìn)行序列化。
基于同一發(fā)明構(gòu)思,本申請(qǐng)實(shí)施例還提供的一種反序列化數(shù)據(jù)對(duì)象裝置,該裝置的結(jié)構(gòu)如圖15所示,包括:
屬性值對(duì)文本獲取模塊1501,用于獲取已被序列化為文本路徑和文本值通過(guò)等號(hào)相連形成的屬性值對(duì)文本;
第一空對(duì)象創(chuàng)建模塊1502,用于將屬性值對(duì)文本和反序列化后的目標(biāo)類(lèi)作為參數(shù),調(diào)用反序列化函數(shù),創(chuàng)建符合目標(biāo)類(lèi)的空對(duì)象,空對(duì)象中的屬性值為空;
根屬性獲取模塊1503,用于遍歷屬性值對(duì)文本,獲取屬性值對(duì)文本中的根屬性;
根屬性文本值獲取模塊1504,用于獲取根屬性對(duì)應(yīng)的文本值;
根屬性文本值轉(zhuǎn)換模塊1505,用于將根屬性對(duì)應(yīng)的文本值轉(zhuǎn)換為目標(biāo)類(lèi)中對(duì)應(yīng)根屬性的類(lèi)型,并賦值給空對(duì)象中的根屬性。
由于在序列化后的屬性值對(duì)文本對(duì)象中,除了根屬性之外,還可能存在非根屬性,由此,在本申請(qǐng)?zhí)峁┑牧硪粋€(gè)反序列化數(shù)據(jù)對(duì)象裝置實(shí)施例中,如圖16所示,該裝置還可以 包括:
路徑判斷模塊1506,用于判斷屬性值對(duì)文本中是否存在與根屬性具有相同路徑前綴的屬性;
屬性確定模塊1507,用于如果存在與根屬性具有相同路徑前綴的屬性,則確定根屬性下具有下級(jí)非根屬性;
第二空對(duì)象創(chuàng)建模塊1508,用于調(diào)用反序列化函數(shù),創(chuàng)建符合根屬性對(duì)應(yīng)類(lèi)的空對(duì)象;
非根屬性獲取模塊1509,用于遍歷對(duì)應(yīng)下級(jí)非根屬性的屬性值對(duì)文本,獲取下級(jí)非根屬性;
非根屬性文本值獲取模塊1510,用于獲取下級(jí)非根屬性對(duì)應(yīng)的文本值;
非根屬性文本值轉(zhuǎn)換模塊1511,用于將下級(jí)非根屬性對(duì)應(yīng)的文本值轉(zhuǎn)換為下級(jí)非根屬性的類(lèi)型,并賦值給根屬性對(duì)應(yīng)類(lèi)的空對(duì)象中的下級(jí)非根屬性。
上述說(shuō)明示出并描述了本申請(qǐng)的優(yōu)選實(shí)施例,但如前,應(yīng)當(dāng)理解本申請(qǐng)并非局限于本文所披露的形式,不應(yīng)看作是對(duì)其他實(shí)施例的排除,而可用于各種其他組合、修改和環(huán)境,并能夠在本文發(fā)明構(gòu)想范圍內(nèi),通過(guò)上述教導(dǎo)或相關(guān)領(lǐng)域的技術(shù)或知識(shí)進(jìn)行改動(dòng)。而本領(lǐng)域人員所進(jìn)行的改動(dòng)和變化不脫離本申請(qǐng)的精神和范圍,則都應(yīng)在本申請(qǐng)所附權(quán)利要求的保護(hù)范圍內(nèi)。