国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng)和方法

      文檔序號(hào):6609741閱讀:293來源:國知局
      專利名稱:對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng)和方法
      技術(shù)領(lǐng)域
      本發(fā)明涉及計(jì)算機(jī)面向?qū)ο缶幊烫幚砑夹g(shù),特別涉及對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng)和方法。
      背景技術(shù)
      在計(jì)算機(jī)面向?qū)ο蟮木幊碳夹g(shù)領(lǐng)域中,串行化(serialization,也稱序列化)是將對(duì)象從一種表示或者格式向另一種表示或者格式的轉(zhuǎn)換。串行化一般意味著雙向過程即將對(duì)象從初始表示轉(zhuǎn)換為其它表示,在需要時(shí)再將其它表示轉(zhuǎn)換回初始表示。也可以將對(duì)象從其它表示轉(zhuǎn)換為初始表示的過程稱為反串行化。反串行化只是相對(duì)于串行化過程來定義的,反串行化和串行化均可統(tǒng)一被稱為串行化。串行化主要用于數(shù)據(jù)的存儲(chǔ)和恢復(fù)(也可認(rèn)為是保存和讀取,即I/O)過程中。
      目前,在面向?qū)ο蟮木幊碳夹g(shù)領(lǐng)域中,串行化用于將某個(gè)對(duì)象的狀態(tài)以及該對(duì)象與其所指向的其它對(duì)象所構(gòu)成的結(jié)構(gòu)圖全部寫到一個(gè)數(shù)據(jù)流中(比如文件、網(wǎng)絡(luò)等),在該數(shù)據(jù)流中不僅保留每個(gè)對(duì)象本身的數(shù)據(jù),也保留了每個(gè)對(duì)象之間的引用關(guān)系,這樣就保證了該對(duì)象結(jié)構(gòu)圖寫入數(shù)據(jù)流之后,在另一時(shí)刻,該對(duì)象結(jié)構(gòu)圖能夠完整地被重新恢復(fù)出來。例如,存儲(chǔ)器內(nèi)(in-memory)對(duì)象或者活(live)對(duì)象(可被訪問且可被使用的對(duì)象)可以串行化為適合于永久存儲(chǔ)或者通過網(wǎng)絡(luò)發(fā)送的永久或瞬時(shí)對(duì)象。存儲(chǔ)器內(nèi)對(duì)象或者活對(duì)象一旦被存儲(chǔ)或者發(fā)送之后,對(duì)象的這種永久表示或者瞬時(shí)表示可以反串行化回存儲(chǔ)器內(nèi)對(duì)象或者活對(duì)象。
      存儲(chǔ)器內(nèi)對(duì)象或者活對(duì)象通常不是孤立的,而是相互聯(lián)系的,構(gòu)成圖狀的引用關(guān)系,被稱為對(duì)象圖形(object graph),如圖1所示obj1(對(duì)象1)直接引用obj3(對(duì)象3)和obj4(對(duì)象4);而obj3(對(duì)象3)又直接引用obj2(對(duì)象2);而obj2(對(duì)象2)又直接引用obj5(對(duì)象5)和該obj2(對(duì)象2)本身;而obj5(對(duì)象5)直接引用obj1(對(duì)象1)。
      從上述的描述可以看出,obj1與obj2和obj5存在間接的引用關(guān)系。在大多數(shù)情況下,當(dāng)一個(gè)對(duì)象被串行化時(shí),以該對(duì)象為起始點(diǎn)的所有被引用的對(duì)象及其相互引用關(guān)系要一起串行化,這樣才能保證反串行化時(shí)能恢復(fù)出正確的初始對(duì)象圖形。
      在串行化處理過程中,作為一個(gè)整體被串行化或者反串行化的最小單元,稱為串行化粒度,通常情況下,作為一個(gè)整體被串行化或者反串行化的單元最小可以是單個(gè)對(duì)象,最大可以是整個(gè)對(duì)象圖形。
      在現(xiàn)有技術(shù)中,要想串行化內(nèi)存中的一個(gè)對(duì)象,歸納起來有兩種方法第一種方法,一次性地保存或者加載(恢復(fù))該對(duì)象及被該對(duì)象直接或間接引用著的所有對(duì)象,即以整個(gè)對(duì)象圖形作為串行化粒度進(jìn)行串行化或者反串行化。這種方法比較有代表性的是微軟.net平臺(tái)提供的默認(rèn)串行化方法。下面參照?qǐng)D1對(duì)該方法的原理進(jìn)行描述,如圖1中的obj1被串行化時(shí)(即obj1被寫入到一個(gè)數(shù)據(jù)流中時(shí)),與該obj1有直接引用關(guān)系的obj3和obj4,以及與該obj1有間接引用關(guān)系的obj2和obj5也要一起被串行化,即obj1與obj2、obj3、obj4、obj5之間的引用關(guān)系一起被寫入obj1所對(duì)應(yīng)的數(shù)據(jù)流中,通常,對(duì)象之間的這種引用關(guān)系由.net平臺(tái)自身提供的代理器來維護(hù),每個(gè)對(duì)象類型對(duì)應(yīng)一個(gè)代理器,該對(duì)象的代理器維護(hù)著該對(duì)象與其它對(duì)象之間的引用關(guān)系,也就是說,該5個(gè)對(duì)象所構(gòu)成的整個(gè)對(duì)象圖形得到了完整的串行化。
      顯然,采用這種方法對(duì)對(duì)象圖形執(zhí)行串行化時(shí),所需的時(shí)間和處理資源隨著對(duì)象圖形規(guī)模的增大而增加,也即越復(fù)雜。包含對(duì)象越多的對(duì)象圖形,執(zhí)行一次串行化或者反串行化操作所需的時(shí)間也就越長。對(duì)于那些想要保持對(duì)象圖形的串行化表示同內(nèi)存中的活對(duì)象完全一致的應(yīng)用,對(duì)象圖形中只要有一個(gè)對(duì)象發(fā)生了改變,就必須重新串行化整個(gè)對(duì)象圖形,導(dǎo)致串行化操作耗費(fèi)大量的時(shí)間和各種處理資源。也就意味著,在執(zhí)行串行化操作的過程中,對(duì)象圖形不得發(fā)生任何改變,否則將導(dǎo)致串行化操作失敗或者串行化表示的數(shù)據(jù)的一致性受到破壞;進(jìn)一步意味著,在串行化操作執(zhí)行期間所有對(duì)該對(duì)象圖形的其它并發(fā)訪問(至少是那些會(huì)改變對(duì)象圖形拓?fù)潢P(guān)系的訪問)都要被掛起。因此,這種方法根本無法應(yīng)用于對(duì)響應(yīng)速度要求較高的系統(tǒng)。
      第二種方法,該方法試圖以單個(gè)對(duì)象為串行化粒度進(jìn)行串行化或者反串行化操作。通常通過一個(gè)串行化管理模塊為每個(gè)串行化單位(即每個(gè)對(duì)象)分配一個(gè)對(duì)應(yīng)的標(biāo)識(shí),串行化時(shí)用這些標(biāo)識(shí)代表被引用對(duì)象寫入串行化數(shù)據(jù)流,而反串行化時(shí)通過這些標(biāo)識(shí)去查找相應(yīng)的被引用對(duì)象,進(jìn)而恢復(fù)對(duì)象圖形。
      該方法中,對(duì)象被串行化時(shí),僅保存與該對(duì)象有直接引用關(guān)系的對(duì)象的代理。下面仍參照?qǐng)D1描述該方法的原理,如圖1中的obj1被串行化到一個(gè)數(shù)據(jù)流中時(shí),與該obj1有直接引用關(guān)系的obj3和obj4的對(duì)象的代理被一起串行化到該obj1所對(duì)應(yīng)的數(shù)據(jù)流中,這些對(duì)象的代理不是由.net自身提供的,需要當(dāng)作整個(gè)目標(biāo)系統(tǒng)的一部分來實(shí)現(xiàn)。而obj3與obj4本身不會(huì)隨著obj1被串行化而被串行化,它們總是被分別串行化到與自己對(duì)應(yīng)的數(shù)據(jù)流中。
      從上述的描述可以看出,該方法中的串行化粒度只是該對(duì)象圖形中的一個(gè)單獨(dú)的對(duì)象,與上述第一種方法相比,該方法把整個(gè)對(duì)象圖形劃分為若干個(gè)部分,每個(gè)部分構(gòu)成一個(gè)串行化粒度,在不同的對(duì)象圖形中,這個(gè)粒度可以是幾個(gè)對(duì)象構(gòu)成的子圖形,也可以是單個(gè)對(duì)象(或者說是最小化的子圖形),這種方法有效地解決了對(duì)對(duì)象圖形的串行化粒度的控制問題,這樣在處理復(fù)雜的對(duì)象圖形時(shí),串行化的效率會(huì)得到極大提高。但是串行化粒度控制通常意味著在系統(tǒng)的設(shè)計(jì)階段必須確定一系列的規(guī)則,而在實(shí)現(xiàn)階段,編寫合適的代碼實(shí)現(xiàn)以上的規(guī)則。通常情況下,對(duì)象圖形在系統(tǒng)的運(yùn)行過程中是不斷變化的,因此該串行化單位的規(guī)則也必須能夠正確應(yīng)對(duì)不斷變化的對(duì)象圖形。采用該方法進(jìn)行串行化操作時(shí),必須為每個(gè)串行化單位的對(duì)象類型實(shí)現(xiàn)大量的串行化代碼,每個(gè)對(duì)象在存儲(chǔ)和加載操作時(shí)都要處理和其它對(duì)象之間的引用關(guān)系,增加了系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn)工作的復(fù)雜度,若系統(tǒng)中包含多種數(shù)據(jù)類型,復(fù)雜度將進(jìn)一步提升。同時(shí)各個(gè)對(duì)象類型相互獨(dú)立(非一致化)串行化實(shí)現(xiàn)很容易隱藏大量設(shè)計(jì)和實(shí)現(xiàn)上的缺陷,給軟件測(cè)試、調(diào)試過程帶來巨大的負(fù)擔(dān),增大了在系統(tǒng)設(shè)計(jì)、實(shí)現(xiàn)和維護(hù)中的工作量,同時(shí)也給軟件和硬件系統(tǒng)的運(yùn)行埋下了不穩(wěn)定的因素。
      該方法中,對(duì)象被反串行化時(shí),如obj1被加載時(shí),該方法試圖采取“首次訪問加載”的機(jī)制,即該obj1被加載時(shí),與該obj1與直接引用關(guān)系的obj3和obj4的加載被推遲到obj1訪問obj3時(shí),obj3才被加載,也就是說,obj3因?yàn)楸籵bj1引用而被加載時(shí),首先要判斷obj3是否被加載過,若obj3已經(jīng)被加載過,則不再對(duì)obj3進(jìn)行加載,否則,obj3會(huì)被加載。同樣道理,obj4的加載也被推遲到obj1訪問obj4時(shí),obj4才被加載。只是在某個(gè)被引用的對(duì)象需要被恢復(fù)時(shí)才被恢復(fù),即一個(gè)對(duì)象在首次被訪問時(shí),才真正從永久存儲(chǔ)介質(zhì)(即數(shù)據(jù)流)中恢復(fù)(加載)到內(nèi)存中,這樣系統(tǒng)就減少了不必要的恢復(fù)運(yùn)算操作,極大地提高了系統(tǒng)的串行化效率。但是,采用該種方法執(zhí)行串行化操作的過程中,如果目標(biāo)系統(tǒng)是并發(fā)的多線程系統(tǒng),對(duì)象必須通過實(shí)現(xiàn)同步機(jī)制確保自身數(shù)據(jù)在串行化及反串行化過程中不被修改。如果要想真正達(dá)成“首次訪問加載”的效果,上述串行化實(shí)現(xiàn)將進(jìn)一步復(fù)雜化,而且必然會(huì)影響本來與串行化無關(guān)的正常邏輯,因?yàn)樵诿看问褂帽灰脤?duì)象前必須判斷該對(duì)象是否已經(jīng)被加載。
      因此,如何能夠提供一種一致化、串行化粒度可控的對(duì)象串行化存儲(chǔ)和恢復(fù)系統(tǒng)和方法是亟待解決的問題。

      發(fā)明內(nèi)容
      本發(fā)明的目的是提供一種對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng)和方法,該系統(tǒng)和方法為目標(biāo)系統(tǒng)提供一致化、近乎透明的對(duì)象存儲(chǔ)支持,且極大減少了開發(fā)的代價(jià)。
      為達(dá)到上述目的,本發(fā)明提供一種對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),所述系統(tǒng)包括串行化包裝器生成模塊,用于為每個(gè)待串行化對(duì)象類型分別生成相應(yīng)的串行化包裝器對(duì)象類型;永久化管理器,用于為所述串行化包裝器生成模塊生成的各個(gè)串行化包裝器對(duì)象類型分別分配相應(yīng)的對(duì)象標(biāo)識(shí),并為各個(gè)串行化包裝器對(duì)象類型所對(duì)應(yīng)的待串行化對(duì)象類型分配相應(yīng)的串行化數(shù)據(jù)流;永久化代理器,用于在所述永久化管理器分配的串行化數(shù)據(jù)流中維持各待串行化對(duì)象類型之間的引用關(guān)系。
      其中,所述永久化管理器包括,映射子模塊I,用于維護(hù)對(duì)象標(biāo)識(shí)和串行化包裝器對(duì)象類型的映射關(guān)系,并提供相應(yīng)的查詢接口;映射子模塊II,提供對(duì)象串行化、反串行化使用的串行化數(shù)據(jù)流,維護(hù)對(duì)象標(biāo)識(shí)到串行化數(shù)據(jù)流的一一映射關(guān)系,并提供相應(yīng)的查詢接口。
      所述永久化管理器還可進(jìn)一步包括待串行化對(duì)象類型集合子模塊,用于維護(hù)作為一個(gè)事務(wù)得到串行化的所有待串行化對(duì)象類型;串行化同步器子模塊,用于判定所述待串行化對(duì)象類型集合子模塊中所有待串行化對(duì)象類型執(zhí)行串行化的時(shí)機(jī)。
      所述待串行化對(duì)象類型的形式為源程序代碼描述的對(duì)象類型,或者為通過反射技術(shù)獲得的對(duì)象類型,或者為CodeDOM對(duì)象圖形描述的對(duì)象類型,或者為Code Model接口描述的對(duì)象類型。
      所述串行化包裝器對(duì)象類型的形式為源程序代碼描述的對(duì)象類型,或者為編譯生成的.NET組裝件中的對(duì)象類型,或者為CodeDOM對(duì)象描述的對(duì)象類型,或者為Code Model接口描述的對(duì)象類型。
      所述串行化包裝器對(duì)象類型和與之對(duì)應(yīng)的待串行化對(duì)象類型實(shí)現(xiàn)一致的接口。
      所述串行化包裝器對(duì)象類型中包含一個(gè)與待串行化對(duì)象類型一致的被包裝對(duì)象成員。
      所述串行化包裝器對(duì)象類型中包含一個(gè)與被包裝方法對(duì)應(yīng)的包裝方法,所述被包裝方法為待串行化對(duì)象類型中每個(gè)可公有訪問的非靜態(tài)、非構(gòu)造方法,所述包裝方法通過被包裝對(duì)象成員調(diào)用與之對(duì)應(yīng)的被包裝方法。
      所述包裝方法和被包裝方法的方法名、返回值類型以及參數(shù)類型不完全一致。
      所述包裝方法和被包裝方法的方法名、返回值類型以及參數(shù)類型還可以完全一致。
      所述串行化包裝器對(duì)象類型中包含一個(gè)與被包裝構(gòu)造方法對(duì)應(yīng)的包裝構(gòu)造方法,所述被包裝構(gòu)造方法為待串行化對(duì)象類型中每個(gè)可公有訪問構(gòu)造方法,所述包裝構(gòu)造方法調(diào)用與之對(duì)應(yīng)的被包裝構(gòu)造方法,創(chuàng)建一個(gè)與所述串行化包裝器對(duì)象類型對(duì)應(yīng)的待串行化對(duì)象類型的實(shí)例,將該實(shí)例賦予所述的待串行化對(duì)象類型成員。
      所述包裝構(gòu)造方法和被包裝構(gòu)造方法的返回值類型以及參數(shù)類型不完全一致。
      所述包裝構(gòu)造方法和被包裝構(gòu)造方法的返回值類型以及參數(shù)類型還可以完全一致。
      所述串行化包裝器對(duì)象類型的每個(gè)實(shí)例均含有一個(gè)與之對(duì)應(yīng)的唯一對(duì)象標(biāo)識(shí)。
      所述串行化包裝器對(duì)象類型包含一個(gè)成員變量,該成員變量用于保存與該串行化包裝器對(duì)象類型對(duì)應(yīng)的對(duì)象標(biāo)識(shí)。
      所述串行化包裝器對(duì)象類型用.NET元數(shù)據(jù)屬性SerializableAttribute標(biāo)記,并實(shí)現(xiàn)串行化ISerializable接口。
      所述永久化代理器用成員變量分別保存被代理對(duì)象的對(duì)象類型和對(duì)象標(biāo)識(shí)。
      本發(fā)明還提供一種對(duì)象的串行化存儲(chǔ)和恢復(fù)的方法,包括如下步驟(a)為每個(gè)待串行化對(duì)象類型分別生成相應(yīng)的串行化包裝器對(duì)象類型;(b)永久化管理器為每個(gè)串行化包裝器對(duì)象類型分別分配相應(yīng)的對(duì)象標(biāo)識(shí),并為各個(gè)串行化包裝器對(duì)象類型所對(duì)應(yīng)的待串行化對(duì)象類型分配相應(yīng)的串行化數(shù)據(jù)流,所述對(duì)象標(biāo)識(shí)與串行化數(shù)據(jù)流對(duì)應(yīng);(c)創(chuàng)建一個(gè)永久化代理器,所述永久化代理器在串行化數(shù)據(jù)流中維持待串行化對(duì)象類型之間的引用關(guān)系。
      其中,所述步驟(a)具體為(a1)編寫各個(gè)待串行化對(duì)象類型的接口屬性、方法部分,并為待串行化對(duì)象類型分別添加“待包裝標(biāo)記元數(shù)據(jù)屬性”標(biāo)記;(a2)對(duì)所述步驟(a1)中有“待包裝標(biāo)記元數(shù)據(jù)屬性”標(biāo)記的待串行化對(duì)象類型進(jìn)行編譯,得到.NET組裝件;(a3)通過.NET提供的反射技術(shù)獲取.NET組裝件中的所有待串行化對(duì)象類型,并生成串行化包裝器對(duì)象類型的源代碼;(a4)為所述(a1)步驟中的各個(gè)待串行化對(duì)象類型編寫具體的實(shí)現(xiàn)代碼;(a5)將所述(a3)步驟中的串行化包裝器對(duì)象類型的源代碼和(a4)步驟各個(gè)待串行化對(duì)象類型的具體的實(shí)現(xiàn)代碼一起編譯,得到組裝件。
      所述步驟(c)或者(a5)之后還包括(d)當(dāng)串行化包裝器對(duì)象類型的實(shí)例的被包裝對(duì)象成員執(zhí)行串行化時(shí),為將要執(zhí)行串行化的串行化包裝器對(duì)象類型的實(shí)例的被包裝對(duì)象成員所引用的串行化包裝器對(duì)象類型的實(shí)例,創(chuàng)建永久化代理器的對(duì)象實(shí)例,所述永久化代理器的對(duì)象實(shí)例與將要執(zhí)行串行化的串行化包裝器對(duì)象類型的實(shí)例的被包裝對(duì)象成員,一起串行化到所述將要執(zhí)行串行化的串行化包裝器對(duì)象類型的實(shí)例所對(duì)應(yīng)的串行化數(shù)據(jù)流中。
      所述步驟(d)之后還包括(e)串行化包裝器對(duì)象類型的實(shí)例的被包裝對(duì)象成員執(zhí)行反串行化時(shí),永久化代理器以被代理對(duì)象的對(duì)象標(biāo)識(shí)向永久化管理器查詢被代理對(duì)象,如果查詢成功,則把查到的對(duì)象作為引用修正的結(jié)果;如果查詢失敗,則永久化代理器創(chuàng)建一個(gè)未初始化的串行化包裝器對(duì)象實(shí)例,并在永久化管理器維護(hù)的對(duì)象標(biāo)識(shí)到串行化包裝器對(duì)象實(shí)例的映射集合中建立相應(yīng)映射。
      本發(fā)明通過串行化包裝器生成模塊,將各種待串行化對(duì)類型轉(zhuǎn)換成統(tǒng)一的串行化包裝器對(duì)象類型,實(shí)現(xiàn)一致的串行化(反串行化)處理,不必為每個(gè)作為串行化粒度的對(duì)象類型實(shí)現(xiàn)大量的串行化代碼,串行化粒度得到很好的控制;在反串行化的引用修正階段,永久化代理器以被代理對(duì)象的對(duì)象標(biāo)識(shí)向永久化管理器查詢被代理對(duì)象,如果查詢成功,則把查到的對(duì)象作為引用修正的結(jié)果;如果查詢失敗--即永久化管理器維護(hù)的對(duì)象標(biāo)識(shí)到串行化包裝器對(duì)象實(shí)例的映射集合中找不到永久化代理器提供的對(duì)象標(biāo)識(shí),則永久化代理器創(chuàng)建一個(gè)未初始化的串行化包裝器對(duì)象實(shí)例,并在永久化管理器維護(hù)的對(duì)象標(biāo)識(shí)到串行化包裝器對(duì)象實(shí)例的映射集合中建立相應(yīng)映射,實(shí)現(xiàn)首次訪問加載。而且,本發(fā)明在盡量不給系統(tǒng)的實(shí)現(xiàn)工作增加負(fù)擔(dān)的前提下,為目標(biāo)系統(tǒng)提供一致化的、近乎透明的(即目標(biāo)系統(tǒng)幾乎察覺不到自己對(duì)對(duì)象存儲(chǔ)系統(tǒng)的依賴)對(duì)象存儲(chǔ)支持。開發(fā)任意的目標(biāo)系統(tǒng)時(shí),使用本發(fā)明提供的對(duì)象串行化存儲(chǔ)和恢復(fù)系統(tǒng)作為其存儲(chǔ)支撐子系統(tǒng),均可一致化地獲得上述背景技術(shù)中第二種方法所能夠達(dá)成的積極效果,同時(shí)把使用現(xiàn)有技術(shù)所必須附加的代價(jià)(包括開發(fā)和其它各個(gè)方面的代價(jià))降低到極小的程度,甚至完全消除這些代價(jià)。


      圖1為對(duì)象圖形示意圖;圖2為本發(fā)明的系統(tǒng)的整體結(jié)構(gòu)示意圖;圖3為圖2所示系統(tǒng)中的永久化管理器的結(jié)構(gòu)示意圖;圖4為圖2所示系統(tǒng)中的串行化包裝器生成模塊的工作流程圖;
      圖5為本發(fā)明系統(tǒng)在執(zhí)行串行化時(shí)的流程示意圖;圖6為本發(fā)明方法的整體流程圖;圖7為本發(fā)明方法的較佳實(shí)施例流程圖。
      具體實(shí)施例方式
      為了使本發(fā)明的目的、方案以及效果更加清楚,下面結(jié)合附圖對(duì)本發(fā)明方案的實(shí)施方式進(jìn)行詳細(xì)描述本發(fā)明的系統(tǒng)的整體結(jié)構(gòu)如圖2所示,包括串行化包裝器生成模塊,用于為每個(gè)待串行化對(duì)象類型分別生成相應(yīng)的串行化包裝器對(duì)象類型;永久化管理器,用于為所述串行化包裝器生成模塊生成的各個(gè)串行化包裝器對(duì)象類型分別分配相應(yīng)的對(duì)象標(biāo)識(shí),并為各個(gè)串行化包裝器對(duì)象類型所對(duì)應(yīng)的待串行化對(duì)象類型分配相應(yīng)的串行化數(shù)據(jù)流,較佳的,所述對(duì)象標(biāo)識(shí)與串行化數(shù)據(jù)流一一對(duì)應(yīng);永久化代理器,用于在所述永久化管理器分配的串行化數(shù)據(jù)流中維持各待串行化對(duì)象類型之間的引用關(guān)系。
      如圖3所示,其中永久化管理器包括映射子模塊I,用于維護(hù)對(duì)象標(biāo)識(shí)和串行化包裝器對(duì)象類型的一一映射關(guān)系,并提供相應(yīng)的查詢接口;串行化包裝器對(duì)象類型的每一個(gè)實(shí)例也與該對(duì)象標(biāo)識(shí)一一對(duì)應(yīng),該對(duì)象標(biāo)識(shí)不受串行化、反串行化操作影響。
      映射子模塊II,提供對(duì)象串行化、反串行化使用的串行化數(shù)據(jù)流,維護(hù)對(duì)象標(biāo)識(shí)到串行化數(shù)據(jù)流的一一映射關(guān)系,并提供相應(yīng)的查詢接口。
      為支持多線程環(huán)境下的事務(wù)的串行化處理,對(duì)象必須通過實(shí)現(xiàn)同步機(jī)制確保自身數(shù)據(jù)在串行化及反串行化過程中不被修改,為此永久化管理器還包括待串行化對(duì)象類型集合子模塊,用于維護(hù)作為一個(gè)事務(wù)得到串行化的所有待串行化對(duì)象類型;串行化同步器子模塊,用于判定待串行化對(duì)象類型集合子模塊中所有待串行化對(duì)象類型執(zhí)行串行化的恰當(dāng)時(shí)機(jī)。
      其中,待串行化對(duì)象類型的形式可以是源程序代碼描述的對(duì)象類型、或者通過反射技術(shù)編譯獲得的對(duì)象類型(如.net中的system.type對(duì)象)、或者CodeDOM對(duì)象圖形描述的對(duì)象類型(如system.CodeDOM.CodeTypeDeclaration對(duì)象)、或者Code Model接口描述的對(duì)象類型(如.net中的EnvDTE.CodeType接口)。
      串行化包裝器對(duì)象類型的形式可以是源程序代碼描述的對(duì)象類型、或者反射技術(shù)編譯獲得的對(duì)象類型(如.net中的system.type對(duì)象)、或者CodeDOM對(duì)象圖形描述的對(duì)象類型(如system.CodeDOM.CodeTypeDeclaration對(duì)象)、或者Code Model接口描述的對(duì)象類型(如.net中的EnvDTE.CodeType接口)。
      串行化包裝器生成模塊為每個(gè)待串行化對(duì)象類型分別生成相應(yīng)的串行化包裝器對(duì)象類型的過程中,可以首先通過反射技術(shù)編譯獲取一個(gè)包含所有待串行化對(duì)象類型的.net組裝件,然后串行化包裝器生成模塊為.net組裝件中的所有待串行化對(duì)象類型分別生成以CodeDOM對(duì)象的形式描述的串生化包裝器對(duì)象類型,并用.net編譯技術(shù)將所述串行化包裝器對(duì)象類型編譯生成一個(gè)組裝件。
      串行化包裝器生成模塊為每個(gè)待串行化對(duì)象類型分別生成相應(yīng)的串行化包裝器對(duì)象類型的過程中,還可以首先通過反射技術(shù)編譯獲取一個(gè)包含所有待串行化對(duì)象類型的.net組裝件,從中選取用預(yù)定義的“待包裝標(biāo)記元數(shù)據(jù)屬性”標(biāo)記過的待串行化對(duì)象類型,為這些對(duì)待串行化對(duì)象類型分別生成以CodeDOM對(duì)象的形式描述的串行化包裝器對(duì)象類型,并用.net編譯技術(shù)將所述串行化包裝器對(duì)象類型編譯生成一個(gè)組裝件。
      為了使串行化包裝器對(duì)象類型能夠有更好的兼容性,需要為待串行化對(duì)象類型和串行化包裝器對(duì)象類型實(shí)現(xiàn)一致的接口。
      上述串行化包裝器對(duì)象類型中包含一個(gè)與待串行化對(duì)象類型一致的成員變量,其中,該成員變量稱為被包裝對(duì)象成員。
      上述串行化包裝器對(duì)象類型中包含一個(gè)包裝方法,上述待串行化對(duì)象類型中包含一個(gè)被包裝方法(被包裝方法是指,待串行化對(duì)象類型中每個(gè)可公有訪問的非靜態(tài)、非構(gòu)造方法),為了使串行化包裝器對(duì)象類型能夠有更好的兼容性,需要實(shí)現(xiàn)包裝方法和被包裝方法的方法名、返回值類型以及參數(shù)類型完全一致。當(dāng)然,也可以使包裝方法和被包裝方法的方法名、返回值類型以及參數(shù)類型不完全一致。
      其中,包裝方法通過被包裝對(duì)象成員調(diào)用與之對(duì)應(yīng)的被包裝方法。
      在包裝方法在調(diào)用與之對(duì)應(yīng)的被包裝方法之前,包裝方法檢查被包裝對(duì)象成員是否已初始化,如果該成員尚未得到初始化,則使用.NET內(nèi)建的反串行化機(jī)制將串行化數(shù)據(jù)流中的數(shù)據(jù)恢復(fù)成活對(duì)象,并將該對(duì)象賦予被包裝對(duì)象成員;如果被包裝對(duì)象成員已被初始化則不進(jìn)行反串行化處理。
      在包裝方法在調(diào)用與之對(duì)應(yīng)的被包裝方法之后,使用.NET內(nèi)建的串行化機(jī)制將被包裝對(duì)象成員串行化到串行化數(shù)據(jù)流中;如果對(duì)象標(biāo)識(shí)已被初始化,則使用該對(duì)象標(biāo)識(shí)執(zhí)行串行化;如果對(duì)象標(biāo)識(shí)尚未得到初始化,則先請(qǐng)求永久化管理器分配一個(gè)新的對(duì)象標(biāo)識(shí),以此對(duì)象標(biāo)識(shí)初始化對(duì)象標(biāo)識(shí)成員,然后使用此對(duì)象標(biāo)識(shí)執(zhí)行串行化。
      在支持多線程環(huán)境下的事務(wù)的串行化處理時(shí),考慮同步機(jī)制的情況下包裝方法在調(diào)用與之對(duì)應(yīng)的被包裝方法之前,調(diào)用串行化同步器子模塊相應(yīng)的方法,要求增加一個(gè)“暫停串行化”計(jì)數(shù)器,如果增加暫停串行化計(jì)數(shù)器的要求正處于掛起狀態(tài),則該調(diào)用會(huì)一直等待,直到掛起被解除,之后,包裝方法檢查被包裝對(duì)象成員是否已初始化,如果該被包裝對(duì)象成員尚未得到初始化,則使用.NET內(nèi)建的反串行化機(jī)制將數(shù)據(jù)流中的數(shù)據(jù)恢復(fù)成活對(duì)象,并將該活對(duì)象賦予被包裝對(duì)象成員;如果被包裝對(duì)象成員已被初始化則不進(jìn)行反串行化處理。
      包裝方法在調(diào)用與之對(duì)應(yīng)的被包裝方法之后,包裝方法使用.NET內(nèi)建的串行化機(jī)制請(qǐng)求待串行化集合子模塊將其對(duì)象標(biāo)識(shí)加入待串行化集合子模塊,如果對(duì)象標(biāo)識(shí)已被初始化,則使用該對(duì)象標(biāo)識(shí)執(zhí)行串行化;如果對(duì)象標(biāo)識(shí)尚未得到初始化,則先請(qǐng)求映射子模塊II分配一個(gè)新的對(duì)象標(biāo)識(shí),以此對(duì)象標(biāo)識(shí)初始化對(duì)象標(biāo)識(shí)成員,然后使用此對(duì)象標(biāo)識(shí)執(zhí)行串行化,同時(shí)調(diào)用串行化同步器子模塊的相應(yīng)方法減少一個(gè)暫停串行化計(jì)數(shù),每次減少一個(gè)暫停串行化計(jì)數(shù)后,串行化同步器子模塊檢查該計(jì)數(shù)是否為零,如果為零,則掛起所有要求增加暫停串行化計(jì)數(shù)的請(qǐng)求,并使用.NET內(nèi)建的串行化機(jī)制,將待串行化集合子模塊中的對(duì)象標(biāo)識(shí)對(duì)應(yīng)的串行化包裝器對(duì)象類型的實(shí)例的被包裝對(duì)象成員分別串行化到它們各自對(duì)應(yīng)的永久化管理器提供的數(shù)據(jù)流對(duì)象中。在串行化操作執(zhí)行完畢后,解除對(duì)增加暫停串行化計(jì)數(shù)的要求的掛起;如不為零則不進(jìn)行更多的處理。
      串行化包裝器對(duì)象類型中包含一個(gè)包裝構(gòu)造方法,上述待串行化對(duì)象類型中包含一個(gè)被包裝構(gòu)造方法(被包裝構(gòu)造方法是指,待串行化對(duì)象類型中每個(gè)可公有訪問構(gòu)造方法),為了使串行化包裝器對(duì)象類型能夠有更好的兼容性,需要實(shí)現(xiàn)該包裝構(gòu)造方法和被包裝構(gòu)造方法的返回值類型以及參數(shù)類型完全一致。當(dāng)然,也可以使包裝構(gòu)造方法和被包裝構(gòu)造方法的返回值類型以及參數(shù)類型不完全一致。
      包裝構(gòu)造方法調(diào)用與之對(duì)應(yīng)的被包裝構(gòu)造方法,創(chuàng)建一個(gè)與所述串行化包裝器對(duì)象類型對(duì)應(yīng)的待串行化對(duì)象類型的實(shí)例,將該實(shí)例賦予所述的待串行化對(duì)象類型的成員。
      永久化代理器用于維護(hù)待串行化對(duì)象之間的引用關(guān)系,并用成員變量分別保存該永久化代理器所代理的串行化包裝器對(duì)象類型和該串行化包裝器對(duì)象類型所對(duì)應(yīng)的對(duì)象標(biāo)識(shí);在執(zhí)行串行化時(shí),即當(dāng)所述串行化包裝器對(duì)象類型的實(shí)例因?qū)ο笠藐P(guān)系而要執(zhí)行串行化時(shí),創(chuàng)建一個(gè)永久化代理器,作為自身的代理寫入串行化數(shù)據(jù)流。
      在執(zhí)行反串行化時(shí),永久化代理器以被代理對(duì)象的對(duì)象標(biāo)識(shí)向永久化管理器查詢被代理對(duì)象,如果查詢成功,則把查到的對(duì)象作為反串行化的結(jié)果;如果查詢失敗,即永久化管理器維護(hù)的對(duì)象標(biāo)識(shí)到串行化包裝器對(duì)象實(shí)例的映射集合中找不到永久化代理器提供的對(duì)象標(biāo)識(shí),則實(shí)例化永久化代理器對(duì)象,即生成一個(gè)該代理器所代理的未初始化的串行化包裝器對(duì)象類型和對(duì)象標(biāo)識(shí)的實(shí)例,并在映射子模塊I中建立相應(yīng)映射關(guān)系。
      串行化包裝器對(duì)象類型的實(shí)例的被包裝對(duì)象成員串行化時(shí)使用的數(shù)據(jù)流用文件流對(duì)象實(shí)現(xiàn),每個(gè)串行化包裝器對(duì)象對(duì)應(yīng)一個(gè)文件,文件用對(duì)象標(biāo)識(shí)命名。
      下面結(jié)合圖1和圖4對(duì)本發(fā)明系統(tǒng)中的串行化包裝器生成模塊的工作原理進(jìn)行說明(1)編寫各個(gè)待串行化對(duì)象類型的接口屬性、方法(即非靜態(tài)公有屬性、方法)部分,但不編寫具體實(shí)現(xiàn)代碼;如為圖1中的obj1、obj2、obj3、obj4、obj5五個(gè)待串行化對(duì)象類型分別編寫接口屬性、方法部分的代碼;且為該五個(gè)待串行化對(duì)象類型分別添加“待包裝標(biāo)記元數(shù)據(jù)屬性”標(biāo)記,當(dāng)然不需要串行化的對(duì)象類型可以不用添加該“待包裝標(biāo)記元數(shù)據(jù)屬性”標(biāo)記。
      (2)對(duì)上述含有“待包裝標(biāo)記元數(shù)據(jù)屬性”標(biāo)記的五個(gè)待串行化對(duì)象類型進(jìn)行編譯,得到.NET組裝件,記為A。
      (3)串行化包裝器生成模塊可以通過.NET提供的反射技術(shù)獲取組裝件A中的所有待串行化對(duì)象類型,并生成obj1-obj5五個(gè)對(duì)象類型對(duì)應(yīng)的串行化包裝器對(duì)象類型(記為W1-W5)的源代碼。
      當(dāng)然,如果組裝件A中的待串行化對(duì)象類型沒有被全部用“待包裝標(biāo)記元數(shù)據(jù)屬性”標(biāo)記過,則從中選取那些被全部用“待包裝標(biāo)記元數(shù)據(jù)屬性”標(biāo)記過的所有待串行化對(duì)象類型。
      (4)為上述第(1)步中的各個(gè)待串行化對(duì)象類型編寫具體的實(shí)現(xiàn)代碼;當(dāng)需要建立待串行化對(duì)象類型間的引用關(guān)系時(shí),將上述第(3)步中生成的串行化包裝器對(duì)象類型作為引用的對(duì)象。
      例如圖1中,Obj1引用了0bj3,這需要實(shí)現(xiàn)為對(duì)象類型Obj1聲明一個(gè)W3類型(Obj3對(duì)應(yīng)的串行化包裝器對(duì)象類型)的成員變量;因?yàn)榇谢b器對(duì)象類型實(shí)現(xiàn)了被包裝的對(duì)象類型的所有公有方法和屬性,其它的實(shí)現(xiàn)工作不會(huì)受到影響。
      (5)將上述第(3)步中的串行化包裝器對(duì)象類型W1-W5的源代碼和第(4)步各個(gè)待串行化對(duì)象類型的具體的實(shí)現(xiàn)代碼一起編譯,得到組裝件,記為Aw。
      下面結(jié)合圖5對(duì)本發(fā)明系統(tǒng)執(zhí)行串行化時(shí)的工作原理進(jìn)行說明(1)串行化包裝器生成模塊分別為0bj1、0bj3和Obj4生成相應(yīng)的串行化包裝生成器類型W1、W3和W4。
      (2)W1向永久化管理器申請(qǐng)串行化數(shù)據(jù)流,永久化管理器中的映射子模塊II為W1實(shí)例分配一個(gè)串行化數(shù)據(jù)流S1。
      (3)當(dāng)Obj1的實(shí)例串行化時(shí),即Obj1的實(shí)例被寫入串行化數(shù)據(jù)流S1中,被Obj1的實(shí)例所直接引用的W3、W4對(duì)象實(shí)例,分別創(chuàng)建永久化代理器的對(duì)象實(shí)例如圖5中的At,At作為W3和W4的代理一起串行化到Obj1對(duì)應(yīng)的數(shù)據(jù)流S1中;而被間接引用的0bj3、Obj4對(duì)象實(shí)例并未串行化。這就達(dá)到了控制串行化粒度的目的。
      在反串行化的引用修正階段,永久化代理器以被代理對(duì)象的對(duì)象標(biāo)識(shí)向永久化管理器查詢被代理對(duì)象,如果查詢成功,則把查到的對(duì)象作為引用修正的結(jié)果;如果查詢失敗--即永久化管理器維護(hù)的對(duì)象標(biāo)識(shí)到串行化包裝器對(duì)象實(shí)例的映射集合中找不到永久化代理器提供的對(duì)象標(biāo)識(shí),則永久化代理器創(chuàng)建一個(gè)未初始化的串行化包裝器對(duì)象實(shí)例,并在永久化管理器維護(hù)的對(duì)象標(biāo)識(shí)到串行化包裝器對(duì)象實(shí)例的映射集合中建立相應(yīng)映射,這就實(shí)現(xiàn)首次訪問加載的效果。
      本發(fā)明的系統(tǒng)執(zhí)行串行化時(shí),可以將永久化管理器(及其所有子模塊)和永久化代理器的實(shí)現(xiàn)代碼編譯為一個(gè).NET類庫(d11)組裝件,記為S,該組裝件S和圖4種所述的組裝件Aw共同構(gòu)成本發(fā)明的系統(tǒng);或者將永久化管理器(及其所有子模塊)、永久化代理器和待包裝標(biāo)記元數(shù)據(jù)屬性的實(shí)現(xiàn)代碼編譯為一個(gè).NET類庫(d11)組裝件,記為S,該組裝件S和圖4種所述的組裝件Aw共同構(gòu)成本發(fā)明的系統(tǒng)。
      本發(fā)明的串行化包裝器生成模塊不僅可以應(yīng)用于串行化技術(shù),而且也可應(yīng)用于其它的面向?qū)ο缶幊碳夹g(shù)中;本發(fā)明的系統(tǒng)不僅可以應(yīng)用于.NET的開發(fā)平臺(tái),也可應(yīng)用于所有編譯性的開發(fā)平臺(tái),如JAVA.IO平臺(tái)。
      本發(fā)明通過設(shè)計(jì)串行化包裝器生成模塊,將各種待串行化對(duì)類型轉(zhuǎn)換成統(tǒng)一的串行化包裝器對(duì)象類型,實(shí)現(xiàn)一致的串行化(反串行化)處理,不必為每個(gè)作為串行化粒度的對(duì)象類型實(shí)現(xiàn)大量的串行化代碼,串行化粒度得到很好的控制;在反串行化的引用修正階段,永久化代理器以被代理對(duì)象的對(duì)象標(biāo)識(shí)向永久化管理器查詢被代理對(duì)象,如果查詢成功,則把查到的對(duì)象作為引用修正的結(jié)果;如果查詢失敗--即永久化管理器維護(hù)的對(duì)象標(biāo)識(shí)到串行化包裝器對(duì)象實(shí)例的映射集合中找不到永久化代理器提供的對(duì)象標(biāo)識(shí),則永久化代理器創(chuàng)建一個(gè)未初始化的串行化包裝器對(duì)象實(shí)例,并在永久化管理器維護(hù)的對(duì)象標(biāo)識(shí)到串行化包裝器對(duì)象實(shí)例的映射集合中建立相應(yīng)映射,實(shí)現(xiàn)首次訪問加載。
      與現(xiàn)有技術(shù)相比,本發(fā)明的系統(tǒng)在盡量不給系統(tǒng)的實(shí)現(xiàn)工作增加負(fù)擔(dān)的前提下,為目標(biāo)系統(tǒng)提供一致化的、近乎透明的(即目標(biāo)系統(tǒng)幾乎察覺不到自己對(duì)對(duì)象存儲(chǔ)系統(tǒng)的依賴)對(duì)象存儲(chǔ)支持。開發(fā)任意的目標(biāo)系統(tǒng)時(shí),使用本發(fā)明的提供的對(duì)象串行化存儲(chǔ)和恢復(fù)系統(tǒng)作為其存儲(chǔ)支撐子系統(tǒng),可一致化地獲得上述背景技術(shù)中第二種方法所能夠達(dá)成的積極效果,同時(shí)把使用現(xiàn)有技術(shù)所必須附加的代價(jià)(包括開發(fā)和其它各個(gè)方面的代價(jià))降低到極小的程度,甚至完全消除這些代價(jià)。
      與上述對(duì)象的串行化存儲(chǔ)和恢復(fù)系統(tǒng)相對(duì)應(yīng),本發(fā)明還提供一種對(duì)象的串行化存儲(chǔ)和恢復(fù)的方法,如圖6所示,包括如下步驟(a)為每個(gè)待串行化對(duì)象類型分別生成相應(yīng)的串行化包裝器對(duì)象類型;
      (b)永久化管理器為每個(gè)串行化包裝器對(duì)象類型分別分配相應(yīng)的對(duì)象標(biāo)識(shí),并為各個(gè)串行化包裝器對(duì)象類型所對(duì)應(yīng)的待串行化對(duì)象類型分配相應(yīng)的串行化數(shù)據(jù)流,較佳的,所述對(duì)象標(biāo)識(shí)與串行化數(shù)據(jù)流一一對(duì)應(yīng);(c)創(chuàng)建一個(gè)永久化代理器,該永久化代理器在串行化數(shù)據(jù)流中維持待串行化對(duì)象類型之間的引用關(guān)系。
      其中,如圖7所示,上述步驟(a)具體為(a1)編寫各個(gè)待串行化對(duì)象類型的接口屬性、方法部分,并為待串行化對(duì)象類型分別添加“待包裝標(biāo)記元數(shù)據(jù)屬性”標(biāo)記;(a2)對(duì)所述步驟(a1)中有“待包裝標(biāo)記元數(shù)據(jù)屬性”標(biāo)記的待串行化對(duì)象類型進(jìn)行編譯,得到.NET組裝件;(a3)通過.NET提供的反射技術(shù)獲取.NET組裝件中的所有待串行化對(duì)象類型,并生成串行化包裝器對(duì)象類型的源代碼;(a4)為所述(a1)步驟中的各個(gè)待串行化對(duì)象類型編寫具體的實(shí)現(xiàn)代碼;(a5)將所述(a3)步驟中的串行化包裝器對(duì)象類型的源代碼和(a4)步驟各個(gè)待串行化對(duì)象類型的具體的實(shí)現(xiàn)代碼一起編譯,得到組裝件。
      上述步驟(c)或者(a5)之后還包括(d)當(dāng)串行化包裝器對(duì)象類型的實(shí)例的被包裝對(duì)象成員執(zhí)行串行化時(shí)(即被包裝對(duì)象成員串行化到與之對(duì)應(yīng)的串行化數(shù)據(jù)流中時(shí)),為將要執(zhí)行串行化的串行化包裝器對(duì)象類型的實(shí)例的被包裝對(duì)象成員所引用的串行化包裝器對(duì)象類型的實(shí)例,創(chuàng)建永久化代理器的對(duì)象實(shí)例,該永久化代理器的對(duì)象實(shí)例與將要執(zhí)行串行化的串行化包裝器對(duì)象類型的實(shí)例的被包裝對(duì)象成員,一起串行化到該將要執(zhí)行串行化的串行化包裝器對(duì)象類型的實(shí)例所對(duì)應(yīng)的串行化數(shù)據(jù)流中。
      (e)串行化包裝器對(duì)象類型的實(shí)例的被包裝對(duì)象成員執(zhí)行反串行化的引用修正階段,永久化代理器以被代理對(duì)象的對(duì)象標(biāo)識(shí)向永久化管理器查詢被代理對(duì)象,如果查詢成功,則把查到的對(duì)象作為引用修正的結(jié)果;如果查詢失敗--即永久化管理器維護(hù)的對(duì)象標(biāo)識(shí)到串行化包裝器對(duì)象實(shí)例的映射集合中找不到永久化代理器提供的對(duì)象標(biāo)識(shí),則永久化代理器創(chuàng)建一個(gè)未初始化的串行化包裝器對(duì)象實(shí)例,并在永久化管理器維護(hù)的對(duì)象標(biāo)識(shí)到串行化包裝器對(duì)象實(shí)例的映射集合中建立相應(yīng)映射,實(shí)現(xiàn)首次訪問加載。
      本發(fā)明的方法通過為每個(gè)待串行化對(duì)象類型分別生成相應(yīng)的串行化包裝器對(duì)象類型,實(shí)現(xiàn)一致的串行化(反串行化)處理,不必為每個(gè)作為串行化粒度的對(duì)象類型實(shí)現(xiàn)大量的串行化代碼,串行化粒度得到很好的控制;在反串行化的引用修正階段,永久化代理器以被代理對(duì)象的對(duì)象標(biāo)識(shí)向永久化管理器查詢被代理對(duì)象,如果查詢成功,則把查到的對(duì)象作為引用修正的結(jié)果;如果查詢失敗--即永久化管理器維護(hù)的對(duì)象標(biāo)識(shí)到串行化包裝器對(duì)象實(shí)例的映射集合中找不到永久化代理器提供的對(duì)象標(biāo)識(shí),則永久化代理器創(chuàng)建一個(gè)未初始化的串行化包裝器對(duì)象實(shí)例,并在永久化管理器維護(hù)的對(duì)象標(biāo)識(shí)到串行化包裝器對(duì)象實(shí)例的映射集合中建立相應(yīng)映射,實(shí)現(xiàn)首次訪問加載。
      與現(xiàn)有技術(shù)相比,本發(fā)明的方法在盡量不給系統(tǒng)的實(shí)現(xiàn)工作增加負(fù)擔(dān)的前提下,為目標(biāo)系統(tǒng)提供一致化的、近乎透明的(即目標(biāo)系統(tǒng)幾乎察覺不到自己對(duì)對(duì)象存儲(chǔ)系統(tǒng)的依賴)對(duì)象存儲(chǔ)支持。開發(fā)任意的目標(biāo)系統(tǒng)時(shí),使用本發(fā)明的提供的對(duì)象串行化存儲(chǔ)和恢復(fù)的方法,可一致化地獲得上述背景技術(shù)中第二種方法所能夠達(dá)成的積極效果,同時(shí)把使用現(xiàn)有技術(shù)所必須附加的代價(jià)(包括開發(fā)和其它各個(gè)方面的代價(jià))降低到極小的程度,甚至完全消除這些代價(jià)。
      以上結(jié)合較佳實(shí)施例來描述本發(fā)明,但并不用以限制本發(fā)明,本技術(shù)領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)知道,凡在本發(fā)明的實(shí)施例的思想的應(yīng)用范圍內(nèi)所作的等效目的的變更與修改,均應(yīng)在本專利申請(qǐng)的保護(hù)范圍之內(nèi)。
      權(quán)利要求
      1.一種對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述系統(tǒng)包括串行化包裝器生成模塊,用于為每個(gè)待串行化對(duì)象類型分別生成相應(yīng)的串行化包裝器對(duì)象類型;永久化管理器,用于為所述串行化包裝器生成模塊生成的各個(gè)串行化包裝器對(duì)象類型分別分配相應(yīng)的對(duì)象標(biāo)識(shí),并為各個(gè)串行化包裝器對(duì)象類型所對(duì)應(yīng)的待串行化對(duì)象類型分配相應(yīng)的串行化數(shù)據(jù)流;永久化代理器,用于在所述永久化管理器分配的串行化數(shù)據(jù)流中維持各待串行化對(duì)象類型之間的引用關(guān)系。
      2.根據(jù)權(quán)利要求1所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述永久化管理器包括,映射子模塊I,用于維護(hù)對(duì)象標(biāo)識(shí)和串行化包裝器對(duì)象類型的映射關(guān)系,并提供相應(yīng)的查詢接口;映射子模塊II,提供對(duì)象串行化、反串行化使用的串行化數(shù)據(jù)流,維護(hù)對(duì)象標(biāo)識(shí)到串行化數(shù)據(jù)流的映射關(guān)系,并提供相應(yīng)的查詢接口。
      3.根據(jù)權(quán)利要求2所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述永久化管理器還包括,待串行化對(duì)象類型集合子模塊,用于維護(hù)作為一個(gè)事務(wù)得到串行化的所有待串行化對(duì)象類型;串行化同步器子模塊,用于判定所述待串行化對(duì)象類型集合子模塊中所有待串行化對(duì)象類型執(zhí)行串行化的時(shí)機(jī)。
      4.根據(jù)權(quán)利要求1所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述待串行化對(duì)象類型的形式為源程序代碼描述的對(duì)象類型。
      5.根據(jù)權(quán)利要求1所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述待串行化對(duì)象類型的形式為通過反射技術(shù)獲得的對(duì)象類型。
      6.根據(jù)權(quán)利要求1所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述待串行化對(duì)象類型的形式為Code DOM對(duì)象圖形描述的對(duì)象類型。
      7.根據(jù)權(quán)利要求1所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述待串行化對(duì)象類型的形式為Code Model接口描述的對(duì)象類型。
      8.根據(jù)權(quán)利要求1所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述串行化包裝器對(duì)象類型的形式為源程序代碼描述的對(duì)象類型。
      9.根據(jù)權(quán)利要求1所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述串行化包裝器對(duì)象類型的形式為編譯生成的.NET組裝件中的對(duì)象類型。
      10.根據(jù)權(quán)利要求1所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述串行化包裝器對(duì)象類型的形式為Code DOM對(duì)象描述的對(duì)象類型。
      11.根據(jù)權(quán)利要求1所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述串行化包裝器對(duì)象類型的形式為Code Model接口描述的對(duì)象類型。
      12.根據(jù)權(quán)利要求1所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述串行化包裝器對(duì)象類型和與之對(duì)應(yīng)的待串行化對(duì)象類型實(shí)現(xiàn)一致的接口。
      13.根據(jù)權(quán)利要求1所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述串行化包裝器對(duì)象類型中包含一個(gè)與待串行化對(duì)象類型一致的被包裝對(duì)象成員。
      14.根據(jù)權(quán)利要求13所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述串行化包裝器對(duì)象類型中包含一個(gè)與被包裝方法對(duì)應(yīng)的包裝方法,所述被包裝方法為待串行化對(duì)象類型中每個(gè)可公有訪問的非靜態(tài)、非構(gòu)造方法,所述包裝方法通過被包裝對(duì)象成員調(diào)用與之對(duì)應(yīng)的被包裝方法。
      15.根據(jù)權(quán)利要求14所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述包裝方法和被包裝方法的方法名、返回值類型以及參數(shù)類型不完全一致。
      16.根據(jù)權(quán)利要求14所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述包裝方法和被包裝方法的方法名、返回值類型以及參數(shù)類型完全一致。
      17.根據(jù)權(quán)利要求1所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述串行化包裝器對(duì)象類型中包含一個(gè)與被包裝構(gòu)造方法對(duì)應(yīng)的包裝構(gòu)造方法,所述被包裝構(gòu)造方法為待串行化對(duì)象類型中每個(gè)可公有訪問構(gòu)造方法,所述包裝構(gòu)造方法調(diào)用與之對(duì)應(yīng)的被包裝構(gòu)造方法,創(chuàng)建一個(gè)與所述串行化包裝器對(duì)象類型對(duì)應(yīng)的待串行化對(duì)象類型的實(shí)例,將該實(shí)例賦予所述的待串行化對(duì)象類型成員。
      18.根據(jù)權(quán)利要求17所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述包裝構(gòu)造方法和被包裝構(gòu)造方法的返回值類型以及參數(shù)類型不完全一致。
      19.根據(jù)權(quán)利要求17所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述包裝構(gòu)造方法和被包裝構(gòu)造方法的返回值類型以及參數(shù)類型完全一致。
      20.根據(jù)權(quán)利要求1所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述串行化包裝器對(duì)象類型的每個(gè)實(shí)例均含有一個(gè)與之對(duì)應(yīng)的唯一對(duì)象標(biāo)識(shí)。
      21.根據(jù)權(quán)利要求1或20所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述串行化包裝器對(duì)象類型包含一個(gè)成員變量,所述成員變量用于保存與所述串行化包裝器對(duì)象類型對(duì)應(yīng)的對(duì)象標(biāo)識(shí)。
      22.根據(jù)權(quán)利要求21所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述串行化包裝器對(duì)象類型用.NET元數(shù)據(jù)屬性SerializableAttribute標(biāo)記,并實(shí)現(xiàn)串行化ISerializable接口。
      23.根據(jù)權(quán)利要求1所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng),其特征在于,所述永久化代理器用成員變量分別保存被代理對(duì)象的對(duì)象類型和對(duì)象標(biāo)識(shí)。
      24.一種對(duì)象的串行化存儲(chǔ)和恢復(fù)的方法,其特征在于,包括如下步驟(a)為每個(gè)待串行化對(duì)象類型分別生成相應(yīng)的串行化包裝器對(duì)象類型;(b)永久化管理器為每個(gè)串行化包裝器對(duì)象類型分別分配相應(yīng)的對(duì)象標(biāo)識(shí),并為各個(gè)串行化包裝器對(duì)象類型所對(duì)應(yīng)的待串行化對(duì)象類型分配相應(yīng)的串行化數(shù)據(jù)流,所述對(duì)象標(biāo)識(shí)與串行化數(shù)據(jù)流一一對(duì)應(yīng);(c)創(chuàng)建一個(gè)永久化代理器,所述永久化代理器在串行化數(shù)據(jù)流中維持待串行化對(duì)象類型之間的引用關(guān)系。
      25.根據(jù)權(quán)利要求24所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的方法,其特征在于,所述步驟(a)具體為(a1)編寫各個(gè)待串行化對(duì)象類型的接口屬性、方法部分,并為待串行化對(duì)象類型分別添加“待包裝標(biāo)記元數(shù)據(jù)屬性”標(biāo)記;(a2)對(duì)所述步驟(a1)中有“待包裝標(biāo)記元數(shù)據(jù)屬性”標(biāo)記的待串行化對(duì)象類型進(jìn)行編譯,得到.NET組裝件;(a3)通過NET提供的反射技術(shù)獲取.NET組裝件中的所有待串行化對(duì)象類型,并生成串行化包裝器對(duì)象類型的源代碼;(a4)為所述(a1)步驟中的各個(gè)待串行化對(duì)象類型編寫具體的實(shí)現(xiàn)代碼;(a5)將所述(a3)步驟中的串行化包裝器對(duì)象類型的源代碼和(a4)步驟各個(gè)待串行化對(duì)象類型的具體的實(shí)現(xiàn)代碼一起編譯,得到組裝件。
      26.根據(jù)權(quán)利要求24或25所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的方法,其特征在于,所述步驟(c)之后還包括(d)串行化包裝器對(duì)象類型的實(shí)例的被包裝對(duì)象成員執(zhí)行串行化時(shí),為將要執(zhí)行串行化的串行化包裝器對(duì)象類型的實(shí)例的被包裝對(duì)象成員所引用的串行化包裝器對(duì)象類型的實(shí)例,創(chuàng)建永久化代理器的對(duì)象實(shí)例,所述永久化代理器的對(duì)象實(shí)例與將要執(zhí)行串行化的串行化包裝器對(duì)象類型實(shí)例的被包裝對(duì)象成員,一起串行化到所述將要執(zhí)行串行化的串行化包裝器對(duì)象類型的實(shí)例所對(duì)應(yīng)的串行化數(shù)據(jù)流中。
      27.根據(jù)權(quán)利要求26所述的對(duì)象的串行化存儲(chǔ)和恢復(fù)的方法,其特征在于,所述步驟(d)之后還包括(e)串行化包裝器對(duì)象類型的實(shí)例的被包裝對(duì)象成員執(zhí)行反串行化時(shí),永久化代理器以被代理對(duì)象的對(duì)象標(biāo)識(shí)向永久化管理器查詢被代理對(duì)象,如果查詢成功,則把查到的對(duì)象作為引用修正的結(jié)果;如果查詢失敗,則永久化代理器創(chuàng)建一個(gè)未初始化的串行化包裝器對(duì)象實(shí)例,并在永久化管理器維護(hù)的對(duì)象標(biāo)識(shí)到串行化包裝器對(duì)象實(shí)例的映射集合中建立相應(yīng)映射。
      全文摘要
      本發(fā)明公開一種對(duì)象的串行化存儲(chǔ)和恢復(fù)的系統(tǒng)和方法,涉及計(jì)算機(jī)面向?qū)ο缶幊烫幚砑夹g(shù),為解決現(xiàn)有的待串行化對(duì)象類型不一致以及串行化粒度不可控的問題而發(fā)明,本發(fā)明包括串行化包裝器生成模塊,用于為每個(gè)待串行化對(duì)象類型分別生成相應(yīng)的串行化包裝器對(duì)象類型;永久化管理器,用于為所述串行化包裝器生成模塊生成的各個(gè)串行化包裝器對(duì)象類型分別分配相應(yīng)的對(duì)象標(biāo)識(shí),并為各個(gè)串行化包裝器對(duì)象類型所對(duì)應(yīng)的待串行化對(duì)象類型分配相應(yīng)的串行化數(shù)據(jù)流;永久化代理器,用于在所述永久化管理器分配的串行化數(shù)據(jù)流中維持待串行化對(duì)象類型之間的引用關(guān)系。本發(fā)明可應(yīng)用于.NET的開發(fā)平臺(tái)以及所有編譯性的開發(fā)平臺(tái)。
      文檔編號(hào)G06F9/44GK101082866SQ20071011089
      公開日2007年12月5日 申請(qǐng)日期2007年6月13日 優(yōu)先權(quán)日2007年6月13日
      發(fā)明者姚磊 申請(qǐng)人:北京北大方正電子有限公司, 北京大學(xué), 北大方正集團(tuán)有限公司
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1