專(zhuān)利名稱(chēng):數(shù)據(jù)打包及其解包的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及通信技術(shù),尤其是指一種簡(jiǎn)單通用的數(shù)據(jù)打包及其解包技術(shù)。
背景技術(shù):
在通訊領(lǐng)域中,各種單板設(shè)備上運(yùn)行的軟件可能千差萬(wàn)別,但是基本上都是由程序文件和數(shù)據(jù)配置文件等多個(gè)文件組成。在設(shè)備正常運(yùn)行維護(hù)過(guò)程中,為了新增軟件功能或者修補(bǔ)軟件漏洞,需要對(duì)單板軟件進(jìn)行升級(jí),一種比較方便的軟件發(fā)行方式是使用軟件包,用戶(hù)只要將單個(gè)軟件包文件通過(guò)某種方式下載到基站主控單板上,然后由主控單板軟件完成軟件包的解包和具體升級(jí)工作。此外,在維護(hù)過(guò)程中往往需要從單板上上載日志文件、數(shù)據(jù)配置文件、甚至內(nèi)存中的內(nèi)容輔助問(wèn)題定位與分析,為了方便用戶(hù)操作,可以由單板軟件將需要上載的數(shù)據(jù)進(jìn)行打包,生成一個(gè)獨(dú)立的文件,再通過(guò)某種方式上載到客戶(hù)機(jī)上進(jìn)行進(jìn)一步的分析。出于傳輸速度、安全性、可靠性等方面考慮,在數(shù)據(jù)打包時(shí)還需要進(jìn)行壓縮、加密、文件內(nèi)容完整性校驗(yàn)(如CRC校驗(yàn))等。
但是目前常見(jiàn)的數(shù)據(jù)打包解包方法缺乏清晰的分層結(jié)構(gòu),現(xiàn)有的方法是將打包數(shù)據(jù)源數(shù)據(jù)的獲取、數(shù)據(jù)的加工處理(如壓縮、加密等)、數(shù)據(jù)的保存等實(shí)現(xiàn)邏輯混在一起,這樣就導(dǎo)致數(shù)據(jù)打包的方法實(shí)現(xiàn)比較復(fù)雜。例如采用現(xiàn)有技術(shù)做新增一個(gè)打包數(shù)據(jù)源、替換一種壓縮方法等,往往改動(dòng)量很大、實(shí)現(xiàn)困難,而且隨著代碼的不斷修改,代碼將變得越來(lái)越晦澀難懂。
綜上所述,現(xiàn)有技術(shù)的方法存在以下缺陷1、對(duì)于數(shù)據(jù)源的讀寫(xiě)處理散布在對(duì)數(shù)據(jù)源處理的多個(gè)位置,層次不清楚,如果要增加新的數(shù)據(jù)源或修改數(shù)據(jù)源的讀寫(xiě)方式,那么需要改動(dòng)的地方很多,修改量很大,并由于層次不清容易操作錯(cuò)誤;
2、現(xiàn)有的方案對(duì)數(shù)據(jù)源的讀寫(xiě)和加工處理邏輯混在一起,邏輯不清晰,相互之間容易產(chǎn)生影響,如果對(duì)數(shù)據(jù)源進(jìn)行了修改,可能會(huì)影響到數(shù)據(jù)加工處理的邏輯,而實(shí)際上兩者完全是獨(dú)立的,不應(yīng)該造成影響;3、如果要修改數(shù)據(jù)文件的打包方式,由于現(xiàn)有技術(shù)中具有代碼可讀性和可維護(hù)性差的缺點(diǎn),會(huì)造成大部分的代碼都需要重寫(xiě)。
發(fā)明內(nèi)容
本發(fā)明提供一種數(shù)據(jù)打包及其解包的方法,用以解決現(xiàn)有技術(shù)中存在數(shù)據(jù)打包方法層次不清晰,代碼可讀性和可維護(hù)性差,并且可擴(kuò)展性也比較差問(wèn)題。
本發(fā)明方法包括以下步驟依據(jù)打包要求,構(gòu)建打包結(jié)構(gòu)樹(shù);按照所建立的打包結(jié)構(gòu)樹(shù)調(diào)用采用抽象類(lèi)CAbsStream派生的相同類(lèi)型的接口,依樹(shù)形從所述打包結(jié)構(gòu)樹(shù)的各個(gè)節(jié)點(diǎn)中獲取數(shù)據(jù)源,在相應(yīng)的接口中對(duì)獲取的數(shù)據(jù)源加工處理,最終匯聚至所述打包結(jié)構(gòu)樹(shù)的根節(jié)點(diǎn),生成打包數(shù)據(jù)流;依樹(shù)形將打包過(guò)程的各個(gè)節(jié)點(diǎn)信息保存在打包數(shù)據(jù)流中;將保存有打包過(guò)程的各個(gè)節(jié)點(diǎn)信息的打包數(shù)據(jù)流寫(xiě)入目標(biāo)文件。
本方法中,所述數(shù)據(jù)源可采用Socket協(xié)議由網(wǎng)絡(luò)上讀取或取自磁盤(pán)文件或取自?xún)?nèi)存。
本方法中,所述數(shù)據(jù)源為基本數(shù)據(jù)源或/和集合數(shù)據(jù)源。
本方法中,所述接口至少包括讀接口、寫(xiě)接口、聚合接口以及數(shù)據(jù)加工處理接口。
本方法中,所述的目標(biāo)文件為打包文件或網(wǎng)絡(luò)數(shù)據(jù)文件,所述打包文件直接保存在本地文件中,所述網(wǎng)絡(luò)數(shù)據(jù)文件直接由網(wǎng)絡(luò)傳輸。
本方法中,還包括在需要增刪打包數(shù)據(jù)中的數(shù)據(jù)源或加工處理方式時(shí),讀取打包過(guò)程的各個(gè)節(jié)點(diǎn)信息,在相應(yīng)的接口中修改。
本方法中,所述打包過(guò)程的各個(gè)節(jié)點(diǎn)信息至少包括所述打包結(jié)構(gòu)樹(shù)中各節(jié)點(diǎn)的類(lèi)型信息以及屬性信息。
本方法中,在依樹(shù)形將打包過(guò)程信息保存在打包數(shù)據(jù)流中的步驟中若所述打包結(jié)構(gòu)樹(shù)只具有一個(gè)根節(jié)點(diǎn),在該步驟中保存根節(jié)點(diǎn)信息;或若所述打包結(jié)構(gòu)樹(shù)包含子節(jié)點(diǎn),在該步驟中先保存根節(jié)點(diǎn)信息,再保存子樹(shù)的個(gè)數(shù)以及各個(gè)子樹(shù)的信息。
本發(fā)明還提供一種數(shù)據(jù)解包的方法,包括以下步驟從獲取的打包文件中讀取打包結(jié)構(gòu)樹(shù)信息;根據(jù)讀取的打包結(jié)構(gòu)樹(shù)信息獲取打包過(guò)程中各個(gè)節(jié)點(diǎn)信息,構(gòu)造出與打包結(jié)構(gòu)樹(shù)對(duì)應(yīng)的解包結(jié)構(gòu)樹(shù);按照所述解包結(jié)構(gòu)樹(shù)依次讀取打包文件中的數(shù)據(jù)。
本發(fā)明有益效果如下本發(fā)明的方案實(shí)現(xiàn)了接口與該接口具體實(shí)現(xiàn)的分離,接口的具體實(shí)現(xiàn)只需要在一個(gè)地方實(shí)現(xiàn)一次,然后就可以通過(guò)靈活的組合構(gòu)造出不同的打包文件結(jié)構(gòu)樹(shù),完全可以實(shí)現(xiàn)根據(jù)用戶(hù)的命令完成各種打包文件結(jié)構(gòu)的定制輸出,使用戶(hù)的應(yīng)用更靈活;另外由于本發(fā)明采用了相同類(lèi)型的接口使代碼具有層次清晰、實(shí)現(xiàn)簡(jiǎn)單、具有良好可讀性、可維護(hù)性、可擴(kuò)展性和可移植性等優(yōu)點(diǎn)。
圖1為本發(fā)明的實(shí)施例的方法流程圖;圖2為本發(fā)明的實(shí)施例的派生對(duì)象類(lèi)結(jié)構(gòu)圖;圖3為本發(fā)明的實(shí)施例中數(shù)據(jù)打包的實(shí)施例;圖4為圖3所示的打包文件結(jié)構(gòu)樹(shù)的打包文件數(shù)據(jù)流示意圖;圖5為本發(fā)明的實(shí)施例中數(shù)據(jù)解包的實(shí)施例。
具體實(shí)施例方式
本發(fā)明提出一種具有簡(jiǎn)單通用性的數(shù)據(jù)打包及其解包方法,本發(fā)明的原理在于,通過(guò)抽象類(lèi)CabsStream派生出數(shù)據(jù)打包方法中采用的各個(gè)類(lèi),如讀、寫(xiě)類(lèi)操作等,本發(fā)明中派生出的各個(gè)接口的類(lèi)型相一致,在對(duì)數(shù)據(jù)進(jìn)行打包或解包處理時(shí),各個(gè)類(lèi)構(gòu)成的層與層之間互相不受影響,如果增加數(shù)據(jù)源或者修改讀寫(xiě)或打包方式時(shí),只需要修改讀寫(xiě)接口的具體實(shí)現(xiàn)以及在打包過(guò)程中存儲(chǔ)在目標(biāo)流中的打包關(guān)鍵信息(打包過(guò)程中的各個(gè)節(jié)點(diǎn)信息);對(duì)接收到的數(shù)據(jù)進(jìn)行解包時(shí),只要讀取打包過(guò)程中保存在目標(biāo)流中的關(guān)鍵信息(如類(lèi)名、屬性等),再按照與打包方法相同的方法進(jìn)行解包,得到構(gòu)成打包文件的各數(shù)據(jù)源。
參考圖1所示,本發(fā)明的打包方法包括以下步驟S1、依據(jù)打包要求,構(gòu)建打包結(jié)構(gòu)樹(shù);S2、按照所建立的打包結(jié)構(gòu)樹(shù)調(diào)用采用抽象類(lèi)CAbsStream派生的相同類(lèi)型的接口,依樹(shù)形從所述打包結(jié)構(gòu)樹(shù)的各個(gè)節(jié)點(diǎn)中獲取數(shù)據(jù)源,在相應(yīng)的接口中對(duì)獲取的數(shù)據(jù)源加工處理,最終匯聚至所述打包結(jié)構(gòu)樹(shù)的根節(jié)點(diǎn),生成打包數(shù)據(jù)流;S3、依樹(shù)形將打包過(guò)程的各個(gè)節(jié)點(diǎn)信息保存在打包數(shù)據(jù)流中;S4、將保存有打包過(guò)程的各個(gè)節(jié)點(diǎn)信息的打包數(shù)據(jù)流寫(xiě)入目標(biāo)文件。
以下采用具體實(shí)施例對(duì)數(shù)據(jù)打包的方法作進(jìn)一步說(shuō)明在數(shù)據(jù)打包中,所打包的數(shù)據(jù)源可為文件,也可為內(nèi)存中的數(shù)據(jù),也可能為從網(wǎng)絡(luò)獲得的數(shù)據(jù),而這些數(shù)據(jù)都可以看作是一種字符流,本實(shí)施例中所述的打包方法就是將一系列文件或內(nèi)存數(shù)據(jù)組成的多個(gè)字符流按照建立的打包結(jié)構(gòu)樹(shù)進(jìn)行歸并處理后得到一個(gè)單一的字符流,然后將其保存到文件中或者直接通過(guò)網(wǎng)絡(luò)進(jìn)行傳輸,與該過(guò)程對(duì)應(yīng)的處理過(guò)程就是數(shù)據(jù)解包過(guò)程。在本實(shí)施例中,進(jìn)行數(shù)據(jù)打包、解包采用的所有類(lèi)都是由抽象類(lèi)CAbsStream派生出來(lái),參考圖2所示的內(nèi)容,由CAbsStream派生出接口的構(gòu)成為讀接口(Read)、寫(xiě)接口(Write)、讀信息接口(ReadSignature)、寫(xiě)信息接口(WriteSignature)、獲得類(lèi)名稱(chēng)接口(GetClassName)、讀其它類(lèi)信息接口(ReadOtherClassinfo)、寫(xiě)其它類(lèi)信息接口(WriteOtherClassinfo)等接口,通過(guò)上述接口將多個(gè)數(shù)據(jù)聚合在一起構(gòu)成集合數(shù)據(jù)源(CCollectionStream)以及對(duì)數(shù)據(jù)源的加工處理都可以采用上述接口實(shí)現(xiàn),進(jìn)一步實(shí)現(xiàn)文件或內(nèi)存中的數(shù)據(jù)的打包或者解包操作。
按照?qǐng)D1所示的步驟,進(jìn)行數(shù)據(jù)打包時(shí),首先涉及到打包結(jié)構(gòu)樹(shù)的建立,打包結(jié)構(gòu)樹(shù)根據(jù)用戶(hù)的打包需求所建立,本實(shí)施例中,用來(lái)打包的數(shù)據(jù)源可以取自本地磁盤(pán)文件或自?xún)?nèi)存(對(duì)應(yīng)圖2中的CFileStream和CMemoryStream)中,也可以通過(guò)Socket協(xié)議由網(wǎng)絡(luò)上的其它終端上獲得,在本實(shí)施例中,這三種數(shù)據(jù)源稱(chēng)為基本數(shù)據(jù)源,此外這些數(shù)據(jù)源可以進(jìn)行某種組合后形成新的數(shù)據(jù)源(對(duì)應(yīng)圖2中的CCollectionStream,稱(chēng)為集合數(shù)據(jù)源),集合數(shù)據(jù)源的使用方法和基本數(shù)據(jù)源完全一致。如果以文件系統(tǒng)進(jìn)行類(lèi)比,這里的基本數(shù)據(jù)源相當(dāng)于文件系統(tǒng)中不同類(lèi)型的文件,而集合數(shù)據(jù)源則相當(dāng)于目錄,目錄中可以包含文件和子目錄。
打包結(jié)構(gòu)樹(shù)的建立原理是,按照打包需求中數(shù)據(jù)源的處理過(guò)程建立,結(jié)構(gòu)樹(shù)的建立可以采用現(xiàn)有技術(shù)實(shí)現(xiàn)。采用本方法建立的打包結(jié)構(gòu)樹(shù)型結(jié)構(gòu)可為多種,是由需要打包的數(shù)據(jù)源的數(shù)目以及路徑所確定。
以圖3的例子說(shuō)明結(jié)構(gòu)樹(shù)的建立過(guò)程,根據(jù)用戶(hù)的打包要求建立結(jié)構(gòu)樹(shù),假設(shè)打包要求為對(duì)數(shù)據(jù)源1和數(shù)據(jù)源2加密后與加密的數(shù)據(jù)源3共同壓縮生成打包文件。依據(jù)該打包要求,建立過(guò)程為1、將基本數(shù)據(jù)源1和基本數(shù)據(jù)源2組合后形成一個(gè)集合數(shù)據(jù)源1,然后對(duì)集合數(shù)據(jù)源1進(jìn)行加密后得到數(shù)據(jù)源4;2、將基本數(shù)據(jù)源3進(jìn)行加密后得到數(shù)據(jù)源5;3、將數(shù)據(jù)源4和數(shù)據(jù)源5組合后形成一個(gè)集合數(shù)據(jù)源2,再對(duì)該集合數(shù)據(jù)源進(jìn)行壓縮最后形成打包文件。
如圖4所示,為上述結(jié)構(gòu)樹(shù)對(duì)應(yīng)的數(shù)據(jù)流示意圖。
建立了打包結(jié)構(gòu)樹(shù)后,就可以了解對(duì)數(shù)據(jù)源的加工處理過(guò)程,即按照步驟S2的描述,調(diào)用采用抽象類(lèi)CAbsStream派生的相同類(lèi)型的接口按照所建立的打包結(jié)構(gòu)樹(shù)進(jìn)行數(shù)據(jù)加工處理,生成打包數(shù)據(jù)流,表示打包過(guò)程可以參考圖3中的虛線標(biāo)識(shí),打包結(jié)構(gòu)樹(shù)的父節(jié)點(diǎn)通過(guò)打包結(jié)構(gòu)樹(shù)的各個(gè)子節(jié)點(diǎn)的Read接口從子節(jié)點(diǎn)中獲取數(shù)據(jù),使數(shù)據(jù)逐步從打包結(jié)構(gòu)樹(shù)的各個(gè)子節(jié)點(diǎn)向父節(jié)點(diǎn)匯聚,并最終匯聚至根節(jié)點(diǎn),形成一個(gè)單一數(shù)據(jù)流的過(guò)程。其中該打包結(jié)構(gòu)樹(shù)中所有子節(jié)點(diǎn)為基本數(shù)據(jù)源對(duì)象,分支子節(jié)點(diǎn)為集合數(shù)據(jù)源或者數(shù)據(jù)源加工處理對(duì)象。
在本實(shí)施例中,依據(jù)結(jié)構(gòu)樹(shù)將由抽象類(lèi)CAbsStream派生出一系列的數(shù)據(jù)源加工處理類(lèi)(也就是與讀寫(xiě)接口相同的加工處理接口),實(shí)現(xiàn)對(duì)數(shù)據(jù)源的壓縮、加密等功能,分別對(duì)應(yīng)圖2中的CCompressStream、CEncryptStream等。
參考圖2,表示了本發(fā)明的方法中數(shù)據(jù)源的構(gòu)成,其中包括CAbsStream數(shù)據(jù)源基類(lèi)CMemoryStream內(nèi)存數(shù)據(jù)源(屬于基本數(shù)據(jù)源)CFileStream磁盤(pán)文件數(shù)據(jù)源(屬于基本數(shù)據(jù)源)CCollectionStream集合數(shù)據(jù)源CDecoratorStream數(shù)據(jù)源加工處理基類(lèi)(它可以對(duì)指定的數(shù)據(jù)源FStream實(shí)施加工處理,它是對(duì)各種數(shù)據(jù)源加工處理類(lèi)共性的描述,在打包結(jié)構(gòu)樹(shù)中不能直接使用它,只能使用它的派生類(lèi),如CCompressStream、CEncryptStream,采用這些派生類(lèi)具體對(duì)數(shù)據(jù)源進(jìn)行加工處理)CCompressStream數(shù)據(jù)源壓縮處理類(lèi)(屬于數(shù)據(jù)源加工處理類(lèi))CEncryptStream數(shù)據(jù)源加密處理類(lèi)(屬于數(shù)據(jù)源加工處理類(lèi))經(jīng)過(guò)加工處理后得到的數(shù)據(jù)源,其用法和功能完全等效于基本數(shù)據(jù)源。
下面對(duì)圖3所示的結(jié)構(gòu)樹(shù)的數(shù)據(jù)打包過(guò)程進(jìn)行說(shuō)明在本實(shí)施例中,進(jìn)行數(shù)據(jù)加工處理的接口類(lèi)型相同,以圖3所示的結(jié)構(gòu)樹(shù)對(duì)數(shù)據(jù)加工處理的過(guò)程進(jìn)行說(shuō)明,首先通過(guò)讀(Read)接口讀取基本數(shù)據(jù)源1、基本數(shù)據(jù)源2以及基本數(shù)據(jù)源3,然后按照建立的結(jié)構(gòu)樹(shù),將讀取到的基本數(shù)據(jù)源1與其基本數(shù)據(jù)源2通過(guò)聚合接口將兩數(shù)據(jù)源聚合得到集合數(shù)據(jù)源1,再分別對(duì)集合數(shù)據(jù)源1和基本數(shù)據(jù)源3進(jìn)行加密處理得到數(shù)據(jù)源4以及數(shù)據(jù)源5,通過(guò)讀接口再讀取數(shù)據(jù)源4以及數(shù)據(jù)源5(對(duì)兩數(shù)據(jù)源的讀取與對(duì)基本數(shù)據(jù)源的操作相同),然后通過(guò)聚合接口將數(shù)據(jù)源4以及數(shù)據(jù)源5聚合得到集合數(shù)據(jù)源2,再對(duì)集合數(shù)據(jù)源2進(jìn)行壓縮處理形成打包文件。在該過(guò)程中,數(shù)據(jù)加工處理包括通過(guò)設(shè)定的接口對(duì)數(shù)據(jù)源的讀取、聚合、加密以及壓縮,最終形成打包數(shù)據(jù)流。
按照打包結(jié)構(gòu)樹(shù)形成打包數(shù)據(jù)流之后,按照步驟S3依樹(shù)形將打包過(guò)程信息保存在打包數(shù)據(jù)流中的步驟中其中若所述打包結(jié)構(gòu)樹(shù)只具有一個(gè)根節(jié)點(diǎn),在該步驟中保存根節(jié)點(diǎn)信息;若所述打包結(jié)構(gòu)樹(shù)包含子節(jié)點(diǎn),在該步驟中先保存根節(jié)點(diǎn)信息,再保存子樹(shù)的個(gè)數(shù)以及各個(gè)子樹(shù)的信息。該所述打包過(guò)程的各節(jié)點(diǎn)信息包括每個(gè)節(jié)點(diǎn)的類(lèi)型信息(基本數(shù)據(jù)源、集合數(shù)據(jù)源等),如保存數(shù)據(jù)源的類(lèi)型名稱(chēng);其次還需要保存節(jié)點(diǎn)的屬性信息,如對(duì)于文件數(shù)據(jù)源,我們需要保存文件大小、文件名稱(chēng)等信息;對(duì)于內(nèi)存數(shù)據(jù)源,需要保存內(nèi)存的起止地址、內(nèi)存大小等。形成打包數(shù)據(jù)流的過(guò)程中,由于本發(fā)明中數(shù)據(jù)源的讀寫(xiě)以及數(shù)據(jù)加工處理采用的接口的類(lèi)型完全相同,例如,CCollectionStream類(lèi)中設(shè)置了一個(gè)CAbsStream對(duì)象的聚合,用來(lái)實(shí)現(xiàn)集合數(shù)據(jù)源的功能;在實(shí)現(xiàn)數(shù)據(jù)源的集合后,將被集合在成集合數(shù)據(jù)源的各子數(shù)據(jù)源的關(guān)鍵信息(如類(lèi)名、屬性等)保存在屬性FSubStreams中,以便對(duì)打包數(shù)據(jù)解包。在保存屬性信息時(shí),如果是基本數(shù)據(jù)源就直接將該數(shù)據(jù)源的類(lèi)信息保存到打包數(shù)據(jù)流中,如果是集合數(shù)據(jù)源,就需要保存構(gòu)成該集合數(shù)據(jù)源的各個(gè)子數(shù)據(jù)源(子節(jié)點(diǎn))的類(lèi)信息。
保存了打包過(guò)程關(guān)鍵信息后執(zhí)行步驟S4,即將保存有打包屬性信息的打包數(shù)據(jù)流寫(xiě)入目標(biāo)文件,完成數(shù)據(jù)打包過(guò)程。在本實(shí)施例中,所述的目標(biāo)文件為打包文件或網(wǎng)絡(luò)數(shù)據(jù)文件,所述打包文件可以直接保存在本地文件中,所述網(wǎng)絡(luò)數(shù)據(jù)可以直接由網(wǎng)絡(luò)傳輸。基本數(shù)據(jù)源中的數(shù)據(jù)根據(jù)打包結(jié)構(gòu)樹(shù)進(jìn)行打包后形成的打包數(shù)據(jù)可以保存在各種基本數(shù)據(jù)源中,例如保存在磁盤(pán)文件數(shù)據(jù)源(CFileStream)中,該打包數(shù)據(jù)也稱(chēng)為打包文件;而該打包數(shù)據(jù)也可以保存在內(nèi)存數(shù)據(jù)源(CMemoryStream)或者網(wǎng)絡(luò)數(shù)據(jù)源(CSocketStream)中,實(shí)現(xiàn)打包文件的直接存儲(chǔ)或者網(wǎng)絡(luò)傳輸。
在本實(shí)施例中,如果打包需求發(fā)生變換,比如要增加或減少打包數(shù)據(jù)源,或者修改數(shù)據(jù)加工處理方式,可以通過(guò)操作設(shè)定的AddSubStream和RemoveSubStream接口實(shí)現(xiàn)聚合對(duì)象的增刪。而CCollectionStream的Read/Write操作也是通過(guò)對(duì)它的子數(shù)據(jù)源調(diào)用Read/Write實(shí)現(xiàn)的,打包需求發(fā)生改變時(shí),所建立的打包結(jié)構(gòu)樹(shù)也發(fā)生改變,采用本實(shí)施例的方法,只要在相應(yīng)的接口中修改該接口的實(shí)現(xiàn)方式就可以實(shí)現(xiàn),而無(wú)需與現(xiàn)有技術(shù)一樣需要在多個(gè)位置進(jìn)行修改。
下面舉個(gè)簡(jiǎn)單的應(yīng)用例子,說(shuō)明本發(fā)明的數(shù)據(jù)打包方法,打包需求是將文件File1.dat和內(nèi)存中的內(nèi)容分別壓縮后再一起進(jìn)行加密最后生成打包文件packfile.dat,根據(jù)這個(gè)需求創(chuàng)建出一個(gè)打包結(jié)構(gòu)樹(shù),按照創(chuàng)建的打包結(jié)構(gòu)樹(shù)。
按照創(chuàng)建的打包結(jié)構(gòu)樹(shù)進(jìn)行的具體打包方法為讀取文件數(shù)據(jù)源File1.dat的數(shù)據(jù);壓縮文件數(shù)據(jù)源數(shù)據(jù),得到壓縮后的數(shù)據(jù)D1;讀取內(nèi)存數(shù)據(jù)源的數(shù)據(jù);壓縮內(nèi)存數(shù)據(jù)源數(shù)據(jù),得到壓縮后的數(shù)據(jù)D2;將數(shù)據(jù)源D1和D2組成一個(gè)集合數(shù)據(jù)源D3;加密集合數(shù)據(jù)源D3,得到加密后的數(shù)據(jù)D4;將打包結(jié)構(gòu)樹(shù)信息(各子數(shù)據(jù)源的信息)寫(xiě)入打包文件packfile.dat中;將數(shù)據(jù)D4寫(xiě)入打包文件packfile.dat中;假設(shè)在上述打包處理過(guò)程中,需要將打包后的數(shù)據(jù)直接通過(guò)網(wǎng)絡(luò)發(fā)送出去,而不是保存在一個(gè)打包文件中,那么可以新增一個(gè)基本數(shù)據(jù)源類(lèi)CSocketStream,并實(shí)現(xiàn)網(wǎng)絡(luò)的讀取和寫(xiě)入,那么只要將上面的實(shí)施例的最后兩行修改為將打包結(jié)構(gòu)樹(shù)信息(各子數(shù)據(jù)源的信息)寫(xiě)入網(wǎng)絡(luò)數(shù)據(jù);
將數(shù)據(jù)D4寫(xiě)入網(wǎng)絡(luò)數(shù)據(jù)的文件。
對(duì)于打包數(shù)據(jù)的解包,首先要讀取打包文件中的打包屬性信息,獲知類(lèi)名信息,構(gòu)造打包結(jié)構(gòu)樹(shù),按照打包結(jié)構(gòu)樹(shù)建立的逆過(guò)程獲得打包數(shù)據(jù)源。解包的方法與打包方法相對(duì)應(yīng),具體為從獲取的打包文件中讀取打包結(jié)構(gòu)樹(shù)信息;根據(jù)讀取的打包結(jié)構(gòu)樹(shù)信息獲取打包過(guò)程中各個(gè)節(jié)點(diǎn)信息,構(gòu)造出與打包結(jié)構(gòu)樹(shù)對(duì)應(yīng)的解包結(jié)構(gòu)樹(shù);按照所述解包結(jié)構(gòu)樹(shù)依次讀取打包文件中的數(shù)據(jù)。
有關(guān)數(shù)據(jù)解包過(guò)程可以參考圖5中的虛線部分,由于數(shù)據(jù)解包方法的原理與數(shù)據(jù)打包方法一致,在此不再進(jìn)行贅述。
綜上所述,在本發(fā)明的方案中,將數(shù)據(jù)打包中涉及到的數(shù)據(jù)源讀取、數(shù)據(jù)加工處理、打包數(shù)據(jù)存儲(chǔ)等過(guò)程進(jìn)行了有效分離,每個(gè)過(guò)程都由對(duì)應(yīng)的處理對(duì)象類(lèi)負(fù)責(zé)處理,相互之間除了保持一致的接口之外,沒(méi)有其他耦合關(guān)系,層次清晰,實(shí)現(xiàn)簡(jiǎn)單,代碼可讀性好。對(duì)于打包處理中的三個(gè)過(guò)程都可以獨(dú)立地增刪和修改其處理方法而不影響另外兩個(gè)過(guò)程。例如,如果要新增一個(gè)基本數(shù)據(jù)源,實(shí)現(xiàn)從數(shù)據(jù)庫(kù)中獲取打包所需的數(shù)據(jù),那么只需要新增一個(gè)數(shù)據(jù)庫(kù)數(shù)據(jù)源類(lèi)(CDatabaseStream),實(shí)現(xiàn)對(duì)指定數(shù)據(jù)庫(kù)表格的讀寫(xiě)就可以了,對(duì)于數(shù)據(jù)加工處理類(lèi)無(wú)需做任何修改,就可以使用該新增的基本數(shù)據(jù)源構(gòu)造打包結(jié)構(gòu)樹(shù)進(jìn)行數(shù)據(jù)打包處理。同理,對(duì)于數(shù)據(jù)加工處理類(lèi)的增刪和修改也不影響基本數(shù)據(jù)源類(lèi),因此本發(fā)明具有良好的可維護(hù)性和可擴(kuò)展性。此外,本發(fā)明的數(shù)據(jù)打包方法的實(shí)現(xiàn)對(duì)于編程語(yǔ)言、編譯環(huán)境、應(yīng)用場(chǎng)景等沒(méi)有限制。因此本發(fā)明的方法可以應(yīng)用在任何情況下,實(shí)現(xiàn)過(guò)程簡(jiǎn)單,并且層次清晰,具有良好的可讀性、可維護(hù)性、可擴(kuò)展性以及可移植性。
顯然,本領(lǐng)域的技術(shù)人員可以對(duì)本發(fā)明進(jìn)行各種改動(dòng)和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動(dòng)和變型在內(nèi)。
權(quán)利要求
1.一種數(shù)據(jù)打包的方法,其特征在于,包括以下步驟依據(jù)打包要求,構(gòu)建打包結(jié)構(gòu)樹(shù);按照所建立的打包結(jié)構(gòu)樹(shù)調(diào)用采用抽象類(lèi)CAbsStream派生的相同類(lèi)型的接口,依樹(shù)形從所述打包結(jié)構(gòu)樹(shù)的各個(gè)節(jié)點(diǎn)中獲取數(shù)據(jù)源,在相應(yīng)的接口中對(duì)獲取的數(shù)據(jù)源加工處理,最終匯聚至所述打包結(jié)構(gòu)樹(shù)的根節(jié)點(diǎn),生成打包數(shù)據(jù)流;依樹(shù)形將打包過(guò)程的各個(gè)節(jié)點(diǎn)信息保存在打包數(shù)據(jù)流中;將保存有打包過(guò)程的各個(gè)節(jié)點(diǎn)信息的打包數(shù)據(jù)流寫(xiě)入目標(biāo)文件。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述數(shù)據(jù)源可采用Socket協(xié)議由網(wǎng)絡(luò)上讀取或取自磁盤(pán)文件或取自?xún)?nèi)存。
3.根據(jù)權(quán)利要求1或2所述的方法,其特征在于,所述數(shù)據(jù)源為基本數(shù)據(jù)源或/和集合數(shù)據(jù)源。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述接口至少包括讀接口、寫(xiě)接口、聚合接口以及數(shù)據(jù)加工處理接口。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述的目標(biāo)文件為打包文件或網(wǎng)絡(luò)數(shù)據(jù)文件,所述打包文件直接保存在本地文件中,所述網(wǎng)絡(luò)數(shù)據(jù)文件直接由網(wǎng)絡(luò)傳輸。
6.根據(jù)權(quán)利要求1所述的方法,其特征在于,還包括在需要增刪打包數(shù)據(jù)中的數(shù)據(jù)源或加工處理方式時(shí),讀取所述打包過(guò)程的各個(gè)節(jié)點(diǎn)信息,在相應(yīng)的接口中修改。
7.根據(jù)權(quán)利要求1或6所述的方法,其特征在于,所述打包過(guò)程的各個(gè)節(jié)點(diǎn)信息至少包括所述打包結(jié)構(gòu)樹(shù)中各節(jié)點(diǎn)的類(lèi)型信息以及屬性信息。
8.根據(jù)權(quán)利要求7所述的方法,其特征在于,在依樹(shù)形將打包過(guò)程信息保存在打包數(shù)據(jù)流中的步驟中若所述打包結(jié)構(gòu)樹(shù)只具有一個(gè)根節(jié)點(diǎn),在該步驟中保存根節(jié)點(diǎn)信息;或若所述打包結(jié)構(gòu)樹(shù)包含子節(jié)點(diǎn),在該步驟中先保存根節(jié)點(diǎn)信息,再保存子樹(shù)的個(gè)數(shù)以及各個(gè)子樹(shù)的信息。
9.一種數(shù)據(jù)解包的方法,其特征在于,包括以下步驟從獲取的打包文件中讀取打包結(jié)構(gòu)樹(shù)信息;根據(jù)讀取的打包結(jié)構(gòu)樹(shù)信息獲取打包過(guò)程中各個(gè)節(jié)點(diǎn)信息,構(gòu)造出與打包結(jié)構(gòu)樹(shù)對(duì)應(yīng)的解包結(jié)構(gòu)樹(shù);按照所述解包結(jié)構(gòu)樹(shù)依次讀取打包文件中的數(shù)據(jù)。
全文摘要
本發(fā)明公開(kāi)了一種數(shù)據(jù)打包的方法,包括以下步驟依據(jù)打包要求,構(gòu)建打包結(jié)構(gòu)樹(shù);按照所建立的打包結(jié)構(gòu)樹(shù)調(diào)用采用抽象類(lèi)CAbsStream派生的相同類(lèi)型的接口,依樹(shù)形從所述打包結(jié)構(gòu)樹(shù)的各個(gè)節(jié)點(diǎn)中獲取數(shù)據(jù)源,在相應(yīng)的接口中對(duì)獲取的數(shù)據(jù)源加工處理,最終匯聚至所述打包結(jié)構(gòu)樹(shù)的根節(jié)點(diǎn),生成打包數(shù)據(jù)流;依樹(shù)形將打包過(guò)程的各個(gè)節(jié)點(diǎn)信息保存在打包數(shù)據(jù)流中;將保存有打包過(guò)程的各個(gè)節(jié)點(diǎn)信息的打包數(shù)據(jù)流寫(xiě)入目標(biāo)文件。采用本方案可以使實(shí)現(xiàn)數(shù)據(jù)打包的代碼具有層次清晰、實(shí)現(xiàn)簡(jiǎn)單、具有良好可讀性、可維護(hù)性、可擴(kuò)展性和可移植性的優(yōu)點(diǎn)。
文檔編號(hào)H04L12/24GK1916844SQ200610127769
公開(kāi)日2007年2月21日 申請(qǐng)日期2006年9月8日 優(yōu)先權(quán)日2006年9月8日
發(fā)明者熊己興 申請(qǐng)人:華為技術(shù)有限公司