本發(fā)明涉及計(jì)算機(jī)應(yīng)用領(lǐng)域,特別是涉及一種目標(biāo)序列化實(shí)現(xiàn)方法和裝置。
背景技術(shù):
對(duì)象序列化技術(shù)是將對(duì)象數(shù)據(jù)轉(zhuǎn)換為另一種持久化數(shù)據(jù)形式的技術(shù),轉(zhuǎn)換之后的數(shù)據(jù)形式必須易于存儲(chǔ)在外部介質(zhì)上,或易于使用網(wǎng)絡(luò)進(jìn)行傳輸。為了使得存儲(chǔ)和傳輸后的數(shù)據(jù)能夠再次變回內(nèi)存中的對(duì)象,這樣的轉(zhuǎn)換必須是可逆的。目標(biāo)序列化技術(shù)在數(shù)據(jù)的傳輸和存儲(chǔ)過(guò)程中,引入了對(duì)象的抽象,使得這個(gè)過(guò)程更加直觀,使用更加方便,因此,目標(biāo)序列化技術(shù)在面向?qū)ο蟮能浖到y(tǒng)中使用非常廣泛。
由于目標(biāo)序列化技術(shù)使用的廣泛性,很多計(jì)算語(yǔ)言都在語(yǔ)言層面,通過(guò)標(biāo)準(zhǔn)庫(kù)的方式,提供目標(biāo)序列化的功能支持,如java語(yǔ)言等。在Android系統(tǒng)中,目標(biāo)序列化代碼讀寫都是手工完成的,例如每新增一個(gè)對(duì)象,在數(shù)據(jù)庫(kù)中通過(guò)需要手動(dòng)寫一遍序列化代碼,然而大量函數(shù)和大量代碼重復(fù),通過(guò)手工復(fù)制粘貼,其開(kāi)發(fā)效率低,且手工復(fù)制粘貼,容易引入缺陷。
技術(shù)實(shí)現(xiàn)要素:
基于此,有必要針對(duì)傳統(tǒng)的目標(biāo)序列化過(guò)程中手工復(fù)制粘貼代碼,導(dǎo)致開(kāi)發(fā)效率低且容易引入缺陷的問(wèn)題,提供一種目標(biāo)序列化實(shí)現(xiàn)方法,能夠提高開(kāi)發(fā)效率且避免引入缺陷。
此外,提供一種目標(biāo)序列化實(shí)現(xiàn)裝置,能夠提高開(kāi)發(fā)效率且避免引入缺陷。
一種目標(biāo)序列化實(shí)現(xiàn)方法,包括以下步驟:
自動(dòng)獲取目標(biāo)中待序列化的部分;
對(duì)所述目標(biāo)中待序列化的部分進(jìn)行解析得到解析結(jié)果,并保存所述解析結(jié)果;
根據(jù)所述解析結(jié)果對(duì)所述目標(biāo)進(jìn)行序列化,轉(zhuǎn)換為打包序列化包裝器;
調(diào)用所述打包序列化包裝器,通過(guò)反射機(jī)制對(duì)所述目標(biāo)進(jìn)行序列化讀寫。
一種目標(biāo)序列化實(shí)現(xiàn)裝置,包括:
獲取模塊,用于自動(dòng)獲取目標(biāo)中待序列化的部分;
解析模塊,用于對(duì)所述目標(biāo)中待序列化的部分進(jìn)行解析得到解析結(jié)果,并保存所述解析結(jié)果;
轉(zhuǎn)換模塊,用于根據(jù)所述解析結(jié)果對(duì)所述目標(biāo)進(jìn)行序列化,轉(zhuǎn)換為打包序列化包裝器;
調(diào)用模塊,用于調(diào)用所述打包序列化包裝器,通過(guò)反射機(jī)制對(duì)所述目標(biāo)進(jìn)行序列化讀寫。
上述目標(biāo)序列化實(shí)現(xiàn)方法和裝置,通過(guò)將自動(dòng)獲取目標(biāo)中待序列化的部分,進(jìn)行解析得到解析結(jié)果,根據(jù)解析結(jié)果對(duì)目標(biāo)進(jìn)行序列化,轉(zhuǎn)換為打包序列化包裝器,通過(guò)調(diào)用打包序列化包裝器及反射機(jī)制進(jìn)行序列化讀寫,不需要手動(dòng)編碼,提高了開(kāi)發(fā)效率,且不需手動(dòng)復(fù)制粘貼,避免了引入缺陷,且轉(zhuǎn)換為打包序列化包裝器,減小了工程代碼量及函數(shù)量,縮減了空間。
附圖說(shuō)明
圖1為一個(gè)實(shí)施例中終端的內(nèi)部結(jié)構(gòu)示意圖;
圖2為一個(gè)實(shí)施例中后臺(tái)服務(wù)器的內(nèi)部結(jié)構(gòu)示意圖;
圖3為一個(gè)實(shí)施例中目標(biāo)序列化實(shí)現(xiàn)方法的流程圖;
圖4為一個(gè)實(shí)施例中類序列化實(shí)現(xiàn)方法的流程圖;
圖5為一個(gè)實(shí)施例中數(shù)據(jù)庫(kù)序列化實(shí)現(xiàn)方法的流程圖;
圖6為一個(gè)實(shí)施例中目標(biāo)序列化實(shí)現(xiàn)裝置的結(jié)構(gòu)框圖;
圖7為另一個(gè)實(shí)施例中目標(biāo)序列化實(shí)現(xiàn)裝置的結(jié)構(gòu)框圖;
圖8為另一個(gè)實(shí)施例中目標(biāo)序列化實(shí)現(xiàn)裝置的結(jié)構(gòu)框圖;
圖9為另一個(gè)實(shí)施例中目標(biāo)序列化實(shí)現(xiàn)裝置的結(jié)構(gòu)框圖;
圖10為另一個(gè)實(shí)施例中目標(biāo)序列化實(shí)現(xiàn)裝置的結(jié)構(gòu)框圖。
具體實(shí)施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說(shuō)明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
可以理解,本發(fā)明所使用的術(shù)語(yǔ)“第一”、“第二”等可在本文中用于描述各種元件,但這些元件不受這些術(shù)語(yǔ)限制。這些術(shù)語(yǔ)僅用于將第一個(gè)元件與另一個(gè)元件區(qū)分。舉例來(lái)說(shuō),在不脫離本發(fā)明的范圍的情況下,可以將第一客戶端稱為第二客戶端,且類似地,可將第二客戶端稱為第一客戶端。第一客戶端和第二客戶端兩者都是客戶端,但其不是同一客戶端。
圖1為一個(gè)實(shí)施例中終端的內(nèi)部結(jié)構(gòu)示意圖。如圖1所示,該終端包括通過(guò)系統(tǒng)總線連接的處理器、存儲(chǔ)介質(zhì)、內(nèi)存、網(wǎng)絡(luò)接口、顯示屏、揚(yáng)聲器和輸入裝置。其中,終端的存儲(chǔ)介質(zhì)存儲(chǔ)有操作系統(tǒng),還包括一種目標(biāo)序列化實(shí)現(xiàn)裝置,該目標(biāo)序列化實(shí)現(xiàn)裝置用于實(shí)現(xiàn)一種目標(biāo)序列化實(shí)現(xiàn)方法。該處理器用于提供計(jì)算和控制能力,支撐整個(gè)終端的運(yùn)行。終端中的內(nèi)存為存儲(chǔ)介質(zhì)中的目標(biāo)序列化實(shí)現(xiàn)裝置的運(yùn)行提供環(huán)境,網(wǎng)絡(luò)接口用于與服務(wù)器進(jìn)行網(wǎng)絡(luò)通信,如發(fā)送數(shù)據(jù)請(qǐng)求至服務(wù)器,接收服務(wù)器返回的數(shù)據(jù)等。其中,目標(biāo)可包括類和/或數(shù)據(jù)庫(kù)等。類可為Java類中所有需要序列化的類。終端的顯示屏可以是液晶顯示屏或者電子墨水顯示屏等,輸入裝置可以是顯示屏上覆蓋的觸摸層,也可以是終端外殼上設(shè)置的按鍵、軌跡球或觸控板,也可以是外接的鍵盤、觸控板或鼠標(biāo)等。該終端可以是手機(jī)、平板電腦或者個(gè)人數(shù)字助理。本領(lǐng)域技術(shù)人員可以理解,圖1中示出的結(jié)構(gòu),僅僅是與本申請(qǐng)方案相關(guān)的部分結(jié)構(gòu)的框圖,并不構(gòu)成對(duì)本申請(qǐng)方案所應(yīng)用于其上的終端的限定,具體的終端可以包括比圖中所示更多或更少的部件,或者組合某些部件,或者具有不同的部件布置。
圖2為一個(gè)實(shí)施例中后臺(tái)服務(wù)器的內(nèi)部結(jié)構(gòu)示意圖。如圖2所示,該后臺(tái)服務(wù)器包括通過(guò)系統(tǒng)總線連接的處理器、存儲(chǔ)介質(zhì)、內(nèi)存和網(wǎng)絡(luò)接口。其中,該服務(wù)器的存儲(chǔ)介質(zhì)存儲(chǔ)有操作系統(tǒng)、數(shù)據(jù)庫(kù)和目標(biāo)序列化實(shí)現(xiàn)裝置,數(shù)據(jù)庫(kù)中存儲(chǔ)有目標(biāo)序列化數(shù)據(jù),該目標(biāo)序列化實(shí)現(xiàn)裝置用于實(shí)現(xiàn)適用于服務(wù)器的一種 目標(biāo)序列化實(shí)現(xiàn)方法。該服務(wù)器的處理器用于提供計(jì)算和控制能力,支撐整個(gè)服務(wù)器的運(yùn)行。該服務(wù)器的內(nèi)存為存儲(chǔ)介質(zhì)中的目標(biāo)序列化實(shí)現(xiàn)裝置的運(yùn)行提供環(huán)境。該服務(wù)器的網(wǎng)絡(luò)接口用于據(jù)以與外部的終端通過(guò)網(wǎng)絡(luò)連接通信,比如接收終端發(fā)送的數(shù)據(jù)請(qǐng)求以及向終端返回?cái)?shù)據(jù)等。服務(wù)器可以用獨(dú)立的服務(wù)器或者是多個(gè)服務(wù)器組成的服務(wù)器集群來(lái)實(shí)現(xiàn)。本領(lǐng)域技術(shù)人員可以理解,圖2中示出的結(jié)構(gòu),僅僅是與本申請(qǐng)方案相關(guān)的部分結(jié)構(gòu)的框圖,并不構(gòu)成對(duì)本申請(qǐng)方案所應(yīng)用于其上的服務(wù)器的限定,具體的服務(wù)器可以包括比圖中所示更多或更少的部件,或者組合某些部件,或者具有不同的部件布置。
圖3為一個(gè)實(shí)施例中目標(biāo)序列化實(shí)現(xiàn)方法的流程圖。如圖3所示,一種目標(biāo)序列化實(shí)現(xiàn)方法,包括以下步驟:
步驟302,自動(dòng)獲取目標(biāo)中待序列化的部分。
具體地,獲取目標(biāo)中待序列化的部分可通過(guò)字符串匹配方式獲取或添加注解標(biāo)記,查詢到注解標(biāo)記獲取,但不限于此。
在一個(gè)實(shí)施例中,步驟302包括:從目標(biāo)中查找與預(yù)定字符串相匹配的成員,將相匹配的成員作為待序列化的部分。
具體地,預(yù)定字符串可根據(jù)需要設(shè)定,如%#,&%,*&等,不限于此。
若目標(biāo)包括類,則從類中查找與第一預(yù)定字符串相匹配的成員,將相匹配的成員作為類中待序列化的部分。
其中,第一預(yù)定字符串可根據(jù)需要設(shè)定,如%#,&%,*&等,不限于此。
若目標(biāo)包括數(shù)據(jù)庫(kù),則從數(shù)據(jù)庫(kù)中查找與第二預(yù)定字符串相匹配的成員,將相匹配的成員作為類中待序列化的部分。
其中,第二預(yù)定字符串可根據(jù)需要設(shè)定,如%#,&%,*&等,不限于此。且第一預(yù)定字符串與第二預(yù)定字符串不同。通過(guò)字符串匹配可快速查找到需要序列化的部分,不需要額外增加標(biāo)記。
步驟304,對(duì)目標(biāo)中待序列化的部分進(jìn)行解析得到解析結(jié)果,并保存該解析結(jié)果。
具體地,目標(biāo)可包括類和數(shù)據(jù)庫(kù)等中一種或兩種。若目標(biāo)包括類,則解析 結(jié)果中包括類信息,主要是類成員的類型信息等。若目標(biāo)包括數(shù)據(jù)庫(kù),則解析結(jié)果中包括數(shù)據(jù)庫(kù)中數(shù)據(jù)表信息等。將解析結(jié)果保存在內(nèi)存緩存中,供后續(xù)調(diào)用使用。
步驟306,根據(jù)該解析結(jié)果對(duì)該目標(biāo)進(jìn)行序列化,轉(zhuǎn)換為打包序列化包裝器。
具體地,將目標(biāo)轉(zhuǎn)換為ParcelWrapper類,即打包序列化包裝器,對(duì)自動(dòng)序列化的部分的包裝。轉(zhuǎn)換支持的基本類型包括String(字符串類型)、SmartParcel(自動(dòng)序列化類型)、Parcelable類(Android系統(tǒng)類型)、ArrayList(數(shù)組列表類型)、Map(數(shù)據(jù)結(jié)構(gòu))等。
步驟308,調(diào)用該打包序列化包裝器,通過(guò)反射機(jī)制對(duì)該目標(biāo)進(jìn)行序列化讀寫。
具體地,調(diào)用ParcelWrapper,根據(jù)解析結(jié)果通過(guò)反射機(jī)制對(duì)目標(biāo)進(jìn)行序列化讀寫。反射機(jī)制是Java系統(tǒng)提供的能力。反射機(jī)制是指Java在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法,對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性,這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為Java語(yǔ)言的反射機(jī)制。
Java反射機(jī)制主要提供了以下功能:在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類;在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象;在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法;在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法;生成動(dòng)態(tài)代理。
上述目標(biāo)序列化實(shí)現(xiàn)方法,通過(guò)將自動(dòng)獲取目標(biāo)中待序列化的部分,進(jìn)行解析得到解析結(jié)果,根據(jù)解析結(jié)果對(duì)目標(biāo)進(jìn)行序列化,轉(zhuǎn)換為打包序列化包裝器,通過(guò)調(diào)用打包序列化包裝器及反射機(jī)制進(jìn)行序列化讀寫,不需要手動(dòng)編碼,提高了開(kāi)發(fā)效率,且不需手動(dòng)復(fù)制粘貼,避免了引入缺陷,且轉(zhuǎn)換為打包序列化包裝器,減小了工程代碼量及函數(shù)量,縮減了空間。
在一個(gè)實(shí)施例中,上述目標(biāo)序列化實(shí)現(xiàn)方法還包括:對(duì)該目標(biāo)中待序列化的成員添加注解標(biāo)記。注解標(biāo)記可為預(yù)先定義的標(biāo)記,用于表示目標(biāo)中需要序列化的成員。目標(biāo)有多個(gè)時(shí),每個(gè)目標(biāo)所采用的注解標(biāo)記不同,每個(gè)目標(biāo)與其注解標(biāo)記對(duì)應(yīng)。
該自動(dòng)獲取目標(biāo)中待序列化的部分包括:獲取該目標(biāo)中記錄有注解標(biāo)記的 部分作為該目標(biāo)中待序列化的部分。通過(guò)添加注解標(biāo)記,方便快速查找到對(duì)應(yīng)的待序列化的部分,且不需重復(fù)編寫代碼和函數(shù),減小了數(shù)據(jù)量。
圖4為一個(gè)實(shí)施例中類序列化實(shí)現(xiàn)方法的流程圖。如圖4所示,目標(biāo)為類,一種類序列化實(shí)現(xiàn)方法,包括以下步驟:
步驟402,對(duì)類中待序列化的成員添加第一注解標(biāo)記。
具體地,第一注解標(biāo)記根據(jù)需要設(shè)定,如@NeedParcel或@n或#m等,不限于此。
例如,類中添加注解標(biāo)記后的代碼如下所示:
上述在類的成員中添加第一注解標(biāo)記@NeedParcel,表明需要序列化。
步驟404,獲取該類中記錄有第一注解標(biāo)記的部分作為類中待序列化的部分。
具體地,識(shí)別出具有第一注解標(biāo)記的部分作為類中待序列化的部分。
步驟406,對(duì)類中待序列化的部分進(jìn)行解析得到解析結(jié)果,并保存該解析結(jié)果。
具體地,解析結(jié)果中包括類信息,主要是類成員的類型信息等。
步驟408,根據(jù)該解析結(jié)果對(duì)類進(jìn)行序列化,轉(zhuǎn)換為打包序列化包裝器。
具體地,將類轉(zhuǎn)換為ParcelWrapper類,即打包序列化包裝器,對(duì)自動(dòng)序列化的部分的包裝。轉(zhuǎn)換支持的基本類型包括String(字符串類型)、SmartParcel(自動(dòng)序列化類型)、Parcelable類(Android系統(tǒng)類型)、ArrayList(數(shù)組列表類型)、Map(數(shù)據(jù)結(jié)構(gòu))等。
SmartParcelable接口為被序列化類的接口,不需要實(shí)現(xiàn)任何函數(shù),通過(guò) SmartParcelable接口可以獲取類中實(shí)現(xiàn)序列化的成員。
步驟410,調(diào)用該打包序列化包裝器,通過(guò)反射機(jī)制對(duì)該類進(jìn)行序列化讀寫。
具體地,調(diào)用ParcelWrapper,根據(jù)解析結(jié)果通過(guò)反射機(jī)制對(duì)目標(biāo)進(jìn)行序列化讀寫。
上述類序列化實(shí)現(xiàn)方法,通過(guò)將類中待序列化的成員添加第一注解標(biāo)記,根據(jù)第一注解標(biāo)記獲取到類中待序列化的部分,進(jìn)行解析得到解析結(jié)果,根據(jù)解析結(jié)果對(duì)類進(jìn)行序列化,轉(zhuǎn)換為打包序列化包裝器,通過(guò)調(diào)用打包序列化包裝器及反射機(jī)制進(jìn)行序列化讀寫,不需要手動(dòng)編碼,提高了開(kāi)發(fā)效率,且不需手動(dòng)復(fù)制粘貼,避免了引入缺陷,且轉(zhuǎn)換為打包序列化包裝器,減小了工程代碼量及函數(shù)量,縮減了空間。
圖5為一個(gè)實(shí)施例中數(shù)據(jù)庫(kù)序列化實(shí)現(xiàn)方法的流程圖。如圖5所示,目標(biāo)為數(shù)據(jù)庫(kù),一種數(shù)據(jù)庫(kù)序列化實(shí)現(xiàn)方法,包括以下步驟:
步驟502,對(duì)數(shù)據(jù)庫(kù)中待序列化的成員添加第二注解標(biāo)記。
具體地,第二注解標(biāo)記根據(jù)需要設(shè)定,如@DbValue或@t或#p等,不限于此。目標(biāo)有多個(gè)時(shí),每個(gè)目標(biāo)所采用的注解標(biāo)記不同。
例如,在原有的DbcacheData接口,需要手動(dòng)實(shí)現(xiàn)以下四個(gè)函數(shù):
*Interface that must be implemented and provided as a public CREATOR
*field that provides some static access of your cache data.
@Public
public static interface DbCreator<T extends DbCacheable>{
@public
public Structure[]structure();
@public
public String[]sortorder();
@public
public T createFromCursor(Cursor cursor);
@public
public int version();
}
添加第二注解標(biāo)注@DbValue后代碼如下:
Class that help Auto write or read the Dbdata;
Version control of this data,define a static int field named VERSION_INT,like;
Private static final int VERSION_INT=8;//數(shù)據(jù)庫(kù)版本號(hào)
Sort order of this data,define a static String filed named ORDER_STR,like;
Simple example:
Public class AppInfo extends AutoDbData{
Private static final int VERSION_INT=8;//數(shù)據(jù)庫(kù)版本號(hào)
//@DbValue(true)means this Colum should be UNIQUE
//default is false;
@DbValue(true)
public int appid;
@DbValue(true)
public String appname;
@DbValue(true)
public String iconUrl;
@DbValue(true)
public String downloadUrl;
@DbValue(true)
public String summary;
@DbValue(true)
public int isRecommend;
@DbValue(true)
public String packageName;
@DbValue(true)
public String h5_url;//觸屏應(yīng)用地址
@DbValue(true)
public String recommendComment;//推薦詳情
@DbValue(true)
public int maskAppType;
//本地
Public int appType=AppType.OTHER_APPLICATION;
Public long installTime=0;
Public int cancelable=0;
Public AppInfo(){
}
此外,還可對(duì)注解標(biāo)記設(shè)置為true,表示在數(shù)據(jù)表中唯一。
步驟504,獲取該數(shù)據(jù)庫(kù)中記錄有第二注解標(biāo)記的部分作為類中待序列化的部分。
具體地,識(shí)別出具有第二注解標(biāo)記的部分作為類中待序列化的部分。
步驟506,對(duì)數(shù)據(jù)庫(kù)中待序列化的部分進(jìn)行解析得到解析結(jié)果,并保存該解析結(jié)果。
具體地,解析結(jié)果中包括數(shù)據(jù)庫(kù)中數(shù)據(jù)表信息等。
步驟508,根據(jù)該解析結(jié)果對(duì)數(shù)據(jù)庫(kù)進(jìn)行序列化,轉(zhuǎn)換為打包序列化包裝器。
具體地,將數(shù)據(jù)庫(kù)轉(zhuǎn)換為ParcelWrapper類,即打包序列化包裝器,對(duì)自動(dòng)序列化的部分的包裝。轉(zhuǎn)換支持的基本類型包括String(字符串類型)、SmartParcel(自動(dòng)序列化類型)、Parcelable類(Android系統(tǒng)類型)、ArrayList(數(shù)組列表類型)、Map(數(shù)據(jù)結(jié)構(gòu))等。
SmartParcelable接口為被序列化類的接口,不需要實(shí)現(xiàn)任何函數(shù),通過(guò)SmartParcelable接口可以獲取類中實(shí)現(xiàn)序列化的成員。
步驟510,調(diào)用該打包序列化包裝器,通過(guò)反射機(jī)制對(duì)該數(shù)據(jù)庫(kù)進(jìn)行序列化讀寫。
具體地,調(diào)用ParcelWrapper,根據(jù)解析結(jié)果通過(guò)反射機(jī)制對(duì)數(shù)據(jù)庫(kù)進(jìn)行序列化讀寫。
上述數(shù)據(jù)庫(kù)序列化實(shí)現(xiàn)方法,通過(guò)將數(shù)據(jù)庫(kù)中待序列化的成員添加第二注解標(biāo)記,根據(jù)第二注解標(biāo)記獲取到數(shù)據(jù)庫(kù)中待序列化的部分,進(jìn)行解析得到解析結(jié)果,根據(jù)解析結(jié)果對(duì)數(shù)據(jù)庫(kù)進(jìn)行序列化,轉(zhuǎn)換為打包序列化包裝器,通過(guò)調(diào)用打包序列化包裝器及反射機(jī)制進(jìn)行序列化讀寫,不需要手動(dòng)編碼,提高了開(kāi)發(fā)效率,且不需手動(dòng)復(fù)制粘貼,避免了引入缺陷,且轉(zhuǎn)換為打包序列化包裝器,減小了工程代碼量及函數(shù)量,縮減了空間。
在一個(gè)實(shí)施例中,上述數(shù)據(jù)庫(kù)序列化實(shí)現(xiàn)方法中,還包括:在數(shù)據(jù)庫(kù)中存儲(chǔ)有數(shù)據(jù)表版本號(hào),并設(shè)置該數(shù)據(jù)表版本號(hào)的靜態(tài)值。
具體地,數(shù)據(jù)表版本號(hào)寫static final int VERSION_INT=8;設(shè)置數(shù)據(jù)包版本號(hào)的靜態(tài)值,每次版本號(hào)更新時(shí),版本號(hào)自動(dòng)增加1。
進(jìn)一步的,上述數(shù)據(jù)庫(kù)序列化實(shí)現(xiàn)方法中,還包括:對(duì)該數(shù)據(jù)表進(jìn)行排序,并設(shè)置排序方式的靜態(tài)值。
具體地,通過(guò)寫“static final String ORDER_STR=Columns.FEED_PRIORITY+"DESC,"+Columns.PUBLISH_DATE+"DESC";”的靜態(tài)值,設(shè)置排序方式,按照排序方式進(jìn)行排序。通過(guò)設(shè)置靜態(tài)值,不需要生成函數(shù),可以通過(guò)反射讀取到信息。數(shù)據(jù)庫(kù)中數(shù)據(jù)表根據(jù)需要自動(dòng)進(jìn)行排序。
在其他實(shí)施例中,上述目標(biāo)序列化實(shí)現(xiàn)方法可同時(shí)對(duì)類和數(shù)據(jù)庫(kù)進(jìn)行序列化,若采用注解標(biāo)記,則類中成員所添加的第一注解標(biāo)記和數(shù)據(jù)庫(kù)中成員所添加的第二注解標(biāo)記不同,以區(qū)分。
上述目標(biāo)序列化實(shí)現(xiàn)方法應(yīng)用于在即時(shí)通信應(yīng)用程序空間中可以減少大約200多個(gè)類,減少900多個(gè)函數(shù)。開(kāi)發(fā)中也無(wú)需再手動(dòng)寫序列化類,提高開(kāi)發(fā)效率。運(yùn)行效率:自動(dòng)化執(zhí)行耗時(shí)分為兩步,類解析(解析出哪些字段需要讀寫,字段類型等)與數(shù)據(jù)讀寫,類解析耗時(shí)較多,對(duì)解析的結(jié)果做緩存,只有第一次用到時(shí)解析一遍。一般數(shù)據(jù)類總的讀寫耗時(shí)2ms左右。此外,對(duì)讀寫密度較大,或者次數(shù)較多的類,也支持使用手動(dòng)寫入,提高執(zhí)行效率。類中的中間對(duì)象可使用對(duì)象池,減少零碎對(duì)象出現(xiàn)。
圖6為一個(gè)實(shí)施例中目標(biāo)序列化實(shí)現(xiàn)裝置的結(jié)構(gòu)框圖。如圖6所示,一種目標(biāo)序列化實(shí)現(xiàn)裝置,包括獲取模塊610、解析模塊620、轉(zhuǎn)換模塊630和調(diào)用 模塊640。其中:
獲取模塊610用于自動(dòng)獲取目標(biāo)中待序列化的部分。
具體地,獲取模塊610獲取目標(biāo)中待序列化的部分可通過(guò)字符串匹配方式獲取或添加注解標(biāo)記,查詢到注解標(biāo)記獲取。
在一個(gè)實(shí)施例中,獲取模塊610還用于從該目標(biāo)中查找與預(yù)定字符串相匹配的成員,將該相匹配的成員作為待序列化的部分。
具體地,預(yù)定字符串可根據(jù)需要設(shè)定,如%#,&%,*&等,不限于此。
若目標(biāo)包括類,則獲取模塊610從類中查找與第一預(yù)定字符串相匹配的成員,將相匹配的成員作為類中待序列化的部分。
其中,第一預(yù)定字符串可根據(jù)需要設(shè)定,如%#,&%,*&等,不限于此。
若目標(biāo)包括數(shù)據(jù)庫(kù),則獲取模塊610從數(shù)據(jù)庫(kù)中查找與第二預(yù)定字符串相匹配的成員,將相匹配的成員作為類中待序列化的部分。
其中,第二預(yù)定字符串可根據(jù)需要設(shè)定,如%#,&%,*&等,不限于此。且第一預(yù)定字符串與第二預(yù)定字符串不同。通過(guò)字符串匹配可快速查找到需要序列化的部分,不需要額外增加標(biāo)記。
解析模塊620用于對(duì)所述目標(biāo)中待序列化的部分進(jìn)行解析得到解析結(jié)果,并保存所述解析結(jié)果。
具體地,目標(biāo)可包括類和數(shù)據(jù)庫(kù)等中一種或兩種。若目標(biāo)包括類,則解析結(jié)果中包括類信息,主要是類成員的類型信息等。若目標(biāo)包括數(shù)據(jù)庫(kù),則解析結(jié)果中包括數(shù)據(jù)庫(kù)中數(shù)據(jù)表信息等。將解析結(jié)果保存在內(nèi)存緩存中,供后續(xù)調(diào)用使用。
轉(zhuǎn)換模塊630用于根據(jù)該解析結(jié)果對(duì)所述類進(jìn)行序列化,轉(zhuǎn)換為打包序列化包裝器。
具體地,將目標(biāo)轉(zhuǎn)換為ParcelWrapper類,即打包序列化包裝器,對(duì)自動(dòng)序列化的部分的包裝。轉(zhuǎn)換支持的基本類型包括String(字符串類型)、SmartParcel(自動(dòng)序列化類型)、Parcelable類(Android系統(tǒng)類型)、ArrayList(數(shù)組列表類型)、Map(數(shù)據(jù)結(jié)構(gòu))等。
調(diào)用模塊640用于調(diào)用所述打包序列化包裝器,通過(guò)反射機(jī)制對(duì)所述類進(jìn) 行序列化讀寫。
具體地,調(diào)用ParcelWrapper,根據(jù)解析結(jié)果通過(guò)反射機(jī)制對(duì)目標(biāo)進(jìn)行序列化讀寫。反射機(jī)制是Java系統(tǒng)提供的能力。
上述目標(biāo)序列化實(shí)現(xiàn)裝置,通過(guò)將自動(dòng)獲取目標(biāo)中待序列化的部分,進(jìn)行解析得到解析結(jié)果,根據(jù)解析結(jié)果對(duì)目標(biāo)進(jìn)行序列化,轉(zhuǎn)換為打包序列化包裝器,通過(guò)調(diào)用打包序列化包裝器及反射機(jī)制進(jìn)行序列化讀寫,不需要手動(dòng)編碼,提高了開(kāi)發(fā)效率,且不需手動(dòng)復(fù)制粘貼,避免了引入缺陷,且轉(zhuǎn)換為打包序列化包裝器,減小了工程代碼量及函數(shù)量,縮減了空間。
圖7為另一個(gè)實(shí)施例中目標(biāo)序列化實(shí)現(xiàn)裝置的結(jié)構(gòu)框圖。如圖7所示,一種目標(biāo)序列化實(shí)現(xiàn)裝置,除了包括獲取模塊610、解析模塊620、轉(zhuǎn)換模塊630和調(diào)用模塊640,還包括標(biāo)注模塊650。其中:
標(biāo)注模塊650用于對(duì)該目標(biāo)中待序列化的成員添加注解標(biāo)記。
注解標(biāo)記可為預(yù)先定義的標(biāo)記,用于表示目標(biāo)中需要序列化的成員。目標(biāo)有多個(gè)時(shí),每個(gè)目標(biāo)所采用的注解標(biāo)記不同,每個(gè)目標(biāo)與其注解標(biāo)記對(duì)應(yīng)。
獲取模塊610還用于獲取該目標(biāo)中記錄有注解標(biāo)記的部分作為該目標(biāo)中待序列化的部分。通過(guò)添加注解標(biāo)記,方便快速查找到對(duì)應(yīng)的待序列化的部分,且不需重復(fù)編寫代碼和函數(shù),減小了數(shù)據(jù)量。
圖8為另一個(gè)實(shí)施例中目標(biāo)序列化實(shí)現(xiàn)裝置的結(jié)構(gòu)框圖。如圖8所示,目標(biāo)包括類,一種目標(biāo)序列化實(shí)現(xiàn)裝置,除了包括獲取模塊610、解析模塊620、轉(zhuǎn)換模塊630和調(diào)用模塊640,還包括第一標(biāo)記模塊660。其中:
第一標(biāo)記模塊660用于對(duì)該類中待序列化的成員添加第一注解標(biāo)記。
具體地,第一注解標(biāo)記根據(jù)需要設(shè)定,如@NeedParcel或@n或#m等,不限于此。
獲取模塊610還用于獲取該類中記錄有第一注解標(biāo)記的部分作為該類中待序列化的部分。
解析模塊620還用于對(duì)類中待序列化的部分進(jìn)行解析得到解析結(jié)果,并保 存該解析結(jié)果。具體地,解析結(jié)果中包括類信息,主要是類成員的類型信息等。
轉(zhuǎn)換模塊630還用于根據(jù)該解析結(jié)果對(duì)類進(jìn)行序列化,轉(zhuǎn)換為打包序列化包裝器。SmartParcelable接口為被序列化類的接口,不需要實(shí)現(xiàn)任何函數(shù),通過(guò)SmartParcelable接口可以獲取類中實(shí)現(xiàn)序列化的成員。
調(diào)用模塊640還用于調(diào)用該打包序列化包裝器,通過(guò)反射機(jī)制對(duì)該類進(jìn)行序列化讀寫。
具體地,調(diào)用ParcelWrapper,根據(jù)解析結(jié)果通過(guò)反射機(jī)制對(duì)目標(biāo)進(jìn)行序列化讀寫。
上述類序列化實(shí)現(xiàn)裝置,通過(guò)將類中待序列化的成員添加第一注解標(biāo)記,根據(jù)第一注解標(biāo)記獲取到類中待序列化的部分,進(jìn)行解析得到解析結(jié)果,根據(jù)解析結(jié)果對(duì)類進(jìn)行序列化,轉(zhuǎn)換為打包序列化包裝器,通過(guò)調(diào)用打包序列化包裝器及反射機(jī)制進(jìn)行序列化讀寫,不需要手動(dòng)編碼,提高了開(kāi)發(fā)效率,且不需手動(dòng)復(fù)制粘貼,避免了引入缺陷,且轉(zhuǎn)換為打包序列化包裝器,減小了工程代碼量及函數(shù)量,縮減了空間。
圖9為另一個(gè)實(shí)施例中目標(biāo)序列化實(shí)現(xiàn)裝置的結(jié)構(gòu)框圖。如圖9所示,目標(biāo)包括數(shù)據(jù)庫(kù),一種目標(biāo)序列化實(shí)現(xiàn)裝置,除了包括獲取模塊610、解析模塊620、轉(zhuǎn)換模塊630和調(diào)用模塊640,還包括第二標(biāo)記模塊670。其中:
第二標(biāo)記模塊670用于對(duì)數(shù)據(jù)庫(kù)成員添加第二注解標(biāo)記。
具體地,第二注解標(biāo)記根據(jù)需要設(shè)定,如@DbValue或@t或#p等,不限于此。目標(biāo)有多個(gè)時(shí),每個(gè)目標(biāo)所采用的注解標(biāo)記不同。
獲取模塊610還用于獲取該數(shù)據(jù)庫(kù)中記錄有第二注解標(biāo)記的部分作為數(shù)據(jù)庫(kù)中待序列化的部分。
解析模塊620還用于對(duì)數(shù)據(jù)庫(kù)中待序列化的部分進(jìn)行解析得到解析結(jié)果,并保存該解析結(jié)果。具體地,解析結(jié)果中包括數(shù)據(jù)庫(kù)中數(shù)據(jù)表信息等。
轉(zhuǎn)換模塊630還用于根據(jù)該解析結(jié)果對(duì)數(shù)據(jù)庫(kù)進(jìn)行序列化,轉(zhuǎn)換為打包序列化包裝器。
調(diào)用模塊640還用于調(diào)用該打包序列化包裝器,通過(guò)反射機(jī)制對(duì)該數(shù)據(jù)庫(kù) 進(jìn)行序列化讀寫。
具體地,調(diào)用ParcelWrapper,根據(jù)解析結(jié)果通過(guò)反射機(jī)制對(duì)數(shù)據(jù)庫(kù)進(jìn)行序列化讀寫。
上述數(shù)據(jù)庫(kù)序列化實(shí)現(xiàn)裝置,通過(guò)將數(shù)據(jù)庫(kù)中待序列化的成員添加第二注解標(biāo)記,根據(jù)第二注解標(biāo)記獲取到數(shù)據(jù)庫(kù)中待序列化的部分,進(jìn)行解析得到解析結(jié)果,根據(jù)解析結(jié)果對(duì)數(shù)據(jù)庫(kù)進(jìn)行序列化,轉(zhuǎn)換為打包序列化包裝器,通過(guò)調(diào)用打包序列化包裝器及反射機(jī)制進(jìn)行序列化讀寫,不需要手動(dòng)編碼,提高了開(kāi)發(fā)效率,且不需手動(dòng)復(fù)制粘貼,避免了引入缺陷,且轉(zhuǎn)換為打包序列化包裝器,減小了工程代碼量及函數(shù)量,縮減了空間。
圖10為另一個(gè)實(shí)施例中目標(biāo)序列化實(shí)現(xiàn)裝置的結(jié)構(gòu)框圖。如圖10所示,目標(biāo)包括數(shù)據(jù)庫(kù),一種目標(biāo)序列化實(shí)現(xiàn)裝置,除了包括獲取模塊610、解析模塊620、轉(zhuǎn)換模塊630、調(diào)用模塊640、第二標(biāo)記模塊670、還包括存儲(chǔ)模塊680和排序模塊690。
存儲(chǔ)模塊680用于在所述數(shù)據(jù)庫(kù)中存儲(chǔ)有數(shù)據(jù)表版本號(hào),并設(shè)置該數(shù)據(jù)表版本號(hào)的靜態(tài)值。
具體地,數(shù)據(jù)表版本號(hào)寫static final int VERSION_INT=8;設(shè)置數(shù)據(jù)包版本號(hào)的靜態(tài)值,每次版本號(hào)更新時(shí),版本號(hào)自動(dòng)增加1。
排序模塊690用于對(duì)該數(shù)據(jù)表進(jìn)行排序,并設(shè)置排序方式的靜態(tài)值。
通過(guò)設(shè)置靜態(tài)值,不需要生成函數(shù),可以通過(guò)反射讀取到信息。
在其他實(shí)施例中,上述目標(biāo)序列化實(shí)現(xiàn)裝置,可包括獲取模塊610、解析模塊620、轉(zhuǎn)換模塊630、調(diào)用模塊640、第一標(biāo)記模塊660、第二標(biāo)記模塊670、存儲(chǔ)模塊680和排序模塊690中任意可能的組合,在此不再贅述。
本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述實(shí)施例方法中的全部或部分流程,是可以通過(guò)計(jì)算機(jī)程序來(lái)指令相關(guān)的硬件來(lái)完成,所述的程序可存儲(chǔ)于一非易失性計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中,該程序在執(zhí)行時(shí),可包括如上述各方法的實(shí)施例的流程。其中,所述的存儲(chǔ)介質(zhì)可為磁碟、光盤、只讀存儲(chǔ)記憶體(Read-Only Memory,ROM)等。
以上所述實(shí)施例僅表達(dá)了本發(fā)明的幾種實(shí)施方式,其描述較為具體和詳細(xì),但并不能因此而理解為對(duì)本發(fā)明專利范圍的限制。應(yīng)當(dāng)指出的是,對(duì)于本領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形和改進(jìn),這些都屬于本發(fā)明的保護(hù)范圍。因此,本發(fā)明專利的保護(hù)范圍應(yīng)以所附權(quán)利要求為準(zhǔn)。