專利名稱:類型橋的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及對象序列化,更特別地,本發(fā)明涉及通過更改序列化引擎的運(yùn)行時間操作的擴(kuò)展例程轉(zhuǎn)換一種類型的對象為另一種類型的對象,而不必替換所述序列化引擎內(nèi)的其他現(xiàn)有例程的方法、系統(tǒng)和計算機(jī)程序產(chǎn)品。
背景技術(shù):
總的來說,序列化指將單個內(nèi)存中的對象或內(nèi)存中的對象的圖(嵌套的)轉(zhuǎn)換為字節(jié)的線性序列,此序列適合于發(fā)送到遠(yuǎn)程位置、在硬盤上持續(xù)存儲等等。反之,反序列化取得字節(jié)的線性序列并創(chuàng)建對應(yīng)的單個內(nèi)存中的對象或內(nèi)存中的對象的圖。序列化和反序列化一起導(dǎo)致初始對象的確切克隆的創(chuàng)建。
在現(xiàn)有技術(shù)中,序列化代碼是作為整體實現(xiàn)寫出,而不考慮定制的,除非替換整個實現(xiàn)。缺乏定制或擴(kuò)展性造成了市場上的不靈活的序列化機(jī)制,市場包括開發(fā)者和其他感興趣的一方。對整體實現(xiàn)而言,遞增的改進(jìn)或定制以直接處理特殊的問題通常是不可能的,且可能需要笨拙的修正或簡單地排除所需的特定操作。只要在任何事件中采取任何定制,實現(xiàn)所需操作的標(biāo)準(zhǔn)例程通常對開發(fā)者是不可訪問的,從而需要重新實現(xiàn),這本質(zhì)上(且通常是抑制性地)增加了開發(fā)所需的定制必須進(jìn)行的工作。因此,通常僅有序列化代碼的開發(fā)者能增加新特性到序列化代碼中,這使最終用戶不能開發(fā)他們自己的增強(qiáng)特性或改進(jìn)現(xiàn)有的特性。
雖然對象的確切拷貝是序列化和反序列化的目標(biāo),對象類型、名稱和數(shù)據(jù)的運(yùn)行時間轉(zhuǎn)換在一些情況下是需要的。如上所述,例如,序列化和反序列化可以用于發(fā)送對象到遠(yuǎn)程位置。遠(yuǎn)程位置可能期望特定的與源對象不同的對象類型、對象數(shù)據(jù)和對象名稱??梢杂矛F(xiàn)有技術(shù)寫出序列化代碼來執(zhí)行對象轉(zhuǎn)換,但是不能在運(yùn)行時間增加轉(zhuǎn)換并且轉(zhuǎn)換對所有用戶都是相同的,這忽略了不同用戶可能有不同需要的可能性。雖然給定的轉(zhuǎn)換可能在特殊的時間對特殊的用戶非常重要,轉(zhuǎn)換總體的相關(guān)性可能對用戶的整體是無意義的,從而不會這樣進(jìn)行開發(fā)。
現(xiàn)有的序列化代碼通常在識別要轉(zhuǎn)換的對象的類型,或基于包含在對象內(nèi)的數(shù)據(jù)進(jìn)行轉(zhuǎn)換時只能提供很少的靈活性。因此,需要基于在運(yùn)行時間更改序列化和反序列化的定制例程將一種類型的對象轉(zhuǎn)換為另一種類型的對象,而不必重新實現(xiàn)標(biāo)準(zhǔn)例程的方法、系統(tǒng)和計算機(jī)程序產(chǎn)品。
發(fā)明內(nèi)容
本發(fā)明涉及轉(zhuǎn)換初始類型的對象為結(jié)果類型的對象,并允許更改或定制轉(zhuǎn)換處理的運(yùn)行時間操作的方法、系統(tǒng)和計算機(jī)程序產(chǎn)品。根據(jù)本發(fā)明在下面詳述的例子實施例,可擴(kuò)展的序列化引擎序列化、反序列化并轉(zhuǎn)換各種類型的對象。序列化引擎的運(yùn)行時間操作由一個或多個實現(xiàn)所需定制或擴(kuò)展的擴(kuò)展例程更改。這些擴(kuò)展例程更改序列化引擎的運(yùn)行時間操作,而無需替換其他現(xiàn)有的例程。
在一個例子實施例中,對由序列化引擎接收以進(jìn)行處理的初始對象識別類型信息?;陬愋托畔?,初始對象被轉(zhuǎn)換為中間表示,中間表示允許運(yùn)行時間修改,包括對象名稱、對象類型和對象數(shù)據(jù)的修改。根據(jù)一個或多個更改序列化引擎的運(yùn)行時間操作的擴(kuò)展例程來修改初始對象的中間表示,且中間表示被轉(zhuǎn)換為結(jié)果對象或結(jié)果類型。
初始對象的中間表示可以包括對象名稱、對象類型、對象數(shù)據(jù),其中的每一個都可以由擴(kuò)展例程修改。中間表示也可以由序列化引擎內(nèi)的一個或多個標(biāo)準(zhǔn)例程修改。中間表示的修改可以基于類型信息內(nèi)的特殊模式、初始對象內(nèi)的對象數(shù)據(jù)、元數(shù)據(jù),或上述的組合。
當(dāng)初始對象為內(nèi)存中的對象時,序列化引擎序列化初始對象來產(chǎn)生結(jié)果對象。結(jié)果對象可以被格式化為可擴(kuò)展標(biāo)記語言(XML)或適合于表示序列化的對象的其他格式。類似地,當(dāng)結(jié)果對象為內(nèi)存中的對象時,序列化引擎反序列化初始對象來產(chǎn)生結(jié)果對象??梢宰鳛榉葱蛄谢幚淼牟糠謱嵗a(chǎn)生結(jié)果對象。在某些情況下,初始對象和結(jié)果對象均為內(nèi)存中的對象,或均為序列化的對象,如序列化引擎執(zhí)行對象轉(zhuǎn)換時。為了減少緩沖的需求,可以延遲中間表示的修改,直到中間表示被轉(zhuǎn)換為結(jié)果對象。
本發(fā)明的其他特性和優(yōu)點將在下面的說明中闡明,且部分將在說明中變得顯然,或通過本發(fā)明的實施例來理解??梢酝ㄟ^在后附的權(quán)利要求中特別指出的工具的方法及其組合來實現(xiàn)和獲得本發(fā)明的特性和優(yōu)點。本發(fā)明的這些和其他特性通過下述說明和后附的權(quán)利要求將變得更加明確,且可以通過本發(fā)明的實施例來理解,如下面所述。
為了說明獲取本發(fā)明的上述和其他特性及優(yōu)點的方式,將通過引用在附圖中展示的特定實施例來呈現(xiàn)對上面簡述的本發(fā)明更具體的說明。應(yīng)理解,這些附圖僅展示本發(fā)明的典型實施例,且不應(yīng)被視為是對本發(fā)明范圍的限制。通過使用附圖,將更確切和具體地說明和解釋本發(fā)明。附圖包括圖1展示符合本發(fā)明的例子序列化模塊和序列化架構(gòu);圖2至圖4在例子序列化、反序列化和類型轉(zhuǎn)換管道的上下文中展示對象轉(zhuǎn)換;圖5A至圖5B展示符合本發(fā)明的序列化、反序列化和轉(zhuǎn)換對象的方法的動作和步驟;及圖6展示對本發(fā)明提供適合的操作環(huán)境的典型系統(tǒng)。
具體實施例方式
本發(fā)明包括轉(zhuǎn)換初始類型的對象為結(jié)果類型的對象并允許更改或定制轉(zhuǎn)換處理的運(yùn)行時間操作的方法、系統(tǒng)和計算機(jī)程序產(chǎn)品。本發(fā)明的實施例可以包括包含各種計算機(jī)硬件的一個或多個專用和/或一個或多個通用計算機(jī),如在下面引用圖6進(jìn)行的詳細(xì)說明。
圖1展示符合本發(fā)明的例子序列化模塊和序列化架構(gòu)100(亦稱為序列化引擎)。對于對象實例110,序列化模塊100產(chǎn)生對應(yīng)的序列化的可擴(kuò)展標(biāo)記語言(XML)對象150。類似地,對XML對象160,序列化模塊100產(chǎn)生對應(yīng)的反序列化的對象實例170。應(yīng)注意,在此應(yīng)用中,序列化通常被用作序列化(如,轉(zhuǎn)換單個內(nèi)存中的對象或內(nèi)存中的對象的圖為適合于發(fā)送到遠(yuǎn)程位置、在硬盤上持續(xù)存儲等等的字節(jié)線性序列)、反序列化(通過字節(jié)線性序列創(chuàng)建對應(yīng)的單個內(nèi)存中的對象或內(nèi)存中的對象的圖)、轉(zhuǎn)換(轉(zhuǎn)換一種對象為另一種對象)等等的通用術(shù)語。下面就是這樣的例子,如,序列化模塊100序列化、反序列化及轉(zhuǎn)換各種類型的對象。
序列化模塊100包括一個或多個反映模塊120、一個或多個轉(zhuǎn)換模塊130及一個或多個產(chǎn)生模塊140。在此例子實施例中,序列化模塊100轉(zhuǎn)換接收到的內(nèi)存中的對象實例110為適合于發(fā)送到遠(yuǎn)程位置的XML對象150,并轉(zhuǎn)換接收到的XML對象實例160為內(nèi)存中的對象實例170。當(dāng)然,“內(nèi)存中的”和“XML”僅僅是可以由序列化模塊100創(chuàng)建或接收的對象類型的例子??梢栽谶\(yùn)行時替換序列化模塊100內(nèi)的每個模塊(反映模塊120、轉(zhuǎn)換模塊130和產(chǎn)生模塊140)以進(jìn)行定制的序列化、反序列化或轉(zhuǎn)換。
反映模塊120負(fù)責(zé)識別接收的對象實例110和接收的XML對象160的類型信息。所述類型信息可以包括存儲的或接收到的元數(shù)據(jù),所述元數(shù)據(jù)和在管理代碼環(huán)境內(nèi)所管理的類型關(guān)聯(lián)。另外,類型信息可以從各種源提供給反映模塊120,所述源包括編譯時間的自動生成、手動生成、標(biāo)準(zhǔn)類型信息等等。
轉(zhuǎn)換模塊130在不同類型的對象之間進(jìn)行轉(zhuǎn)換。下面引用圖2至4更詳細(xì)地說明例子轉(zhuǎn)換處理。在不同對象之間的轉(zhuǎn)換可以是任意復(fù)雜的且包括中間對象的生成。此復(fù)雜度的部分包括基于對象內(nèi)的數(shù)據(jù)及與對象關(guān)聯(lián)的類型的模式進(jìn)行轉(zhuǎn)換。例如,執(zhí)行哪一種轉(zhuǎn)換取決于特定的對象類型或類型名稱、對類型存在特定命名或類型的屬性、存在有特定元數(shù)據(jù)與其關(guān)聯(lián)的屬性、和對象關(guān)聯(lián)的對象名稱,等等。可以延遲轉(zhuǎn)換直到產(chǎn)生結(jié)果對象的以減少或避免緩沖需求,否則緩沖可能是轉(zhuǎn)換一種對象為另一種對象所必須的。
產(chǎn)生模塊140負(fù)責(zé)產(chǎn)生由序列化模塊100生成的結(jié)果對象。在XML對象150的情況下,產(chǎn)生模塊創(chuàng)建該對象-它對該對象產(chǎn)生適當(dāng)?shù)腦ML-并可以寫對象到流中。在對象實例170的情況下,產(chǎn)生模塊140實例化并產(chǎn)生該對象。
如上所示,序列化模塊100也被稱為序列化引擎。如圖1所示,序列化引擎由幾個模塊的有序集合組成。這些模塊一起負(fù)責(zé)所有的操作。單獨的模塊被稱為類型橋,因為,如下面更詳細(xì)的說明,模塊從一種類型轉(zhuǎn)換到另一種類型(或不同類型之間的橋)。類型橋允許在運(yùn)行時間進(jìn)行類型和實例轉(zhuǎn)換和/或追蹤有關(guān)被序列化、反序列化或轉(zhuǎn)換的對象的信息。引用圖2至圖4,類型橋的有序集合被稱為類型橋管道,并通常對應(yīng)于轉(zhuǎn)換模塊130的有序集合。對每個由序列化引擎執(zhí)行的操作,可以存在單獨的類型橋管道。有序列化管道(如圖2)、反序列化管道(如圖3)、轉(zhuǎn)換管道(如圖4)、對象拷貝管道等等。在單獨討論圖2至圖4的每一個之前,在下面展示總地適用于所有三個圖的信息。
對圖2至圖4中所示的例子管道,負(fù)責(zé)對象的序列化、反序列化和轉(zhuǎn)換的代碼(一個或多個模塊)是作為多個預(yù)定義的類型橋來實現(xiàn)的。這些模塊被放置在適當(dāng)?shù)墓艿乐胁⒃谶\(yùn)行時間使用。(圖1中的虛線用于表示在各種類型橋管道中使用的可用類型橋模塊)。圖1中所示的例子序列化引擎的公用應(yīng)用編程接口(API)的大部分僅是這個管道預(yù)定義集合的包裝。這展示了序列化引擎如何可擴(kuò)展-序列化引擎是簡單的抽象管道集合。特定邏輯的實際實現(xiàn)位于可以在任何時候被替換的可嵌入模塊中。
對圖2至圖4中所示的例子類型橋管道,給定類型的類型橋能夠轉(zhuǎn)換三種類型的對象之一初始類型對象、中間類型對象和結(jié)果類型對象。在圖4中,初始類型對象是管理的代碼對象且結(jié)果類型對象是基于萬維網(wǎng)聯(lián)盟(W3C)Infoset標(biāo)準(zhǔn)的XML對象。在所有三個圖中展示的中間類型對象或中間表示是序列化引擎中的結(jié)構(gòu)并且,如下面更詳細(xì)的說明,表示可擴(kuò)展點。中間表示是基于不定類型的不定對象。這樣,通過用不定類型存儲有類型的數(shù)據(jù)并通過對該類型定義的行為操作存儲的數(shù)據(jù),不定類型定義行為和有類型的數(shù)據(jù)存儲。
圖2展示序列化有初始類型或格式210的內(nèi)存中的初始對象240的例子類型橋200。(如在說明書和權(quán)利要求中所用,術(shù)語“類型”應(yīng)被廣義地解釋并包括任何對象類型或格式)。使用標(biāo)準(zhǔn)例程,初始對象240被轉(zhuǎn)換為有中間類型或格式220的中間表示260A。如下面更詳細(xì)的說明,此中間類型是不定的,允許對象類型和對象數(shù)據(jù)兩者被改變。然而,中間格式220和初始格式210也可以是相同、密切相關(guān)、有一些不同、完全不同等等。
定制擴(kuò)展例程260轉(zhuǎn)換初始對象240的中間表示260A為中間表示260B。此轉(zhuǎn)換可以包括改變對象類型、對象名稱、對象數(shù)據(jù)等等。定制擴(kuò)展例程260一般地表示序列化引擎的運(yùn)行時間擴(kuò)展,特別地表示類型橋管道200。注意使用定制擴(kuò)展例程260并不需要重新實現(xiàn)標(biāo)準(zhǔn)例程250,通?,F(xiàn)有的序列化實現(xiàn)的情況下重新實現(xiàn)標(biāo)準(zhǔn)例程是必須的。
標(biāo)準(zhǔn)例程270轉(zhuǎn)換中間表示260B為有結(jié)果類型或格式230的結(jié)果對象280。結(jié)果對象280適合于發(fā)送到遠(yuǎn)程位置,進(jìn)行持續(xù)存儲等等。因此,結(jié)果對象280的結(jié)果格式230包括廣泛的數(shù)據(jù)類型。在此,如在本說明的其他部分中,對象類型、格式和表示為廣義的術(shù)語,包括對象的總體類型和格式及可以包含在該對象內(nèi)的類型、格式、名稱和數(shù)據(jù)。
圖3展示反序列化有初始類型或格式330的對象340的例子類型橋300。類似于上面的圖2,標(biāo)準(zhǔn)例程350轉(zhuǎn)換初始對象340為有中間類型或格式320的中間表示360A。定制擴(kuò)展例程360轉(zhuǎn)換中間表示360A為中間表示360B。注意,中間類型320表示一個或多個中間類型。因此,中間表示360A和中間表示360B可以為不同的類型,但仍然適當(dāng)?shù)乇环Q為中間類型,尤其是相對于初始類型330和結(jié)果類型或格式310。
標(biāo)準(zhǔn)例程370轉(zhuǎn)換中間表示360B為有結(jié)果類型310的結(jié)果對象380。因為類型橋管道360是用于反序列化的,結(jié)果對象380為實例化并產(chǎn)生的內(nèi)存中的對象。如下面更詳細(xì)的說明,類型橋300和實例化并產(chǎn)生對象實例的代碼關(guān)聯(lián)。此代碼可以被稱為實例工廠或書寫器,或?qū)懝S,并一般對應(yīng)于圖1中所示的產(chǎn)生模塊140。
圖4展示轉(zhuǎn)換初始對象400為結(jié)果對象480的例子類型橋管道400。圖4中的單個類型橋能夠轉(zhuǎn)換三種不同的對象類型或格式之一管理的代碼/CLR格式化的對象410、中間/Flex格式化的對象420和Infoset/XML格式化的對象430。CLR表示通用語言運(yùn)行時間并且是Microsoft的.NET管理的執(zhí)行環(huán)境。在其他特性中,CLR的優(yōu)點包括跨語言集成、跨語言出錯處理等等。語言編譯器產(chǎn)生說明類型、成員和引用的元數(shù)據(jù)。元數(shù)據(jù)和代碼一起被存儲在通用語言運(yùn)行時間可移植執(zhí)行文件中。當(dāng)然,CLR只是管理的代碼類型的一個例子。如圖4所示,兩個對象都可以為內(nèi)存中的對象(如CLR格式化的對象)或,作為另外的選擇,兩者都可以為序列化的對象(如,Infoset格式化的對象)。換句話說,初始對象和結(jié)果對象兩者可以是同一類型的。
CLR對象410是包含數(shù)據(jù)和行為的CLR類型的實例,雖然只有數(shù)據(jù)和序列化目的相關(guān)。如上所示,根據(jù)由數(shù)據(jù)節(jié)點的預(yù)定義集合用特定語法組成的樹結(jié)構(gòu)的W3C標(biāo)準(zhǔn)來格式化Infoset對象或表示430。Flex對象420是序列化引擎內(nèi)的結(jié)構(gòu)并表示該序列化器的可擴(kuò)展點。
Flex對象為基于不定類型的不定對象。不定類型也稱為Flex類型。在圖4中展示的例子類型橋管道400中,F(xiàn)lex類型和它對應(yīng)的CLR類型起同樣的作用定義行為和類型數(shù)據(jù)存儲。類似地,F(xiàn)lex對象和CLR對象起通用的作用存儲有類型的數(shù)據(jù)并通過對該類型定義的行為操作此數(shù)據(jù)。使用Flex類型的原因是CLR類型不是不定的。
對圖4中所示的例子類型橋管道,對可以被序列化的類型進(jìn)行特定限制以支持簡單性和可擴(kuò)展性。這些限制減少了序列化器需要識別的不同模式和組合的數(shù)量以序列化和反序列化給定的類型。在這一點,序列化引擎只需要知道如何序列化其類型符合所謂的核心模型的CLR對象。符合核心模型的類型必須將它們的數(shù)據(jù)作為屬性(或字段)暴露或?qū)崿F(xiàn)特殊的接口(該接口定義明確的讀和寫方法)。另外,這些類型需要提供公用的缺省構(gòu)造函數(shù)。不符合核心模型的類型不能被序列化。
Flex類型和Flex對象被用于改變給定CLR對象的形狀(成員、接口等)以符合所述核心模型。對給定的CLR對象,F(xiàn)lex類型可以被構(gòu)建為除了該實例的CLR類型還暴露不同的成員集合和類型信息。基于Flex類型的Flex對象可以被實例化為代理特定的對CLR對象自身的調(diào)用。Flex對象也可以對CLR對象內(nèi)的數(shù)據(jù)執(zhí)行可選的轉(zhuǎn)換,或者在代理前,或者在代理后。因此,可以用各種方法暴露CLR對象內(nèi)的數(shù)據(jù),包括符合核心模型的方法。因此,類型橋可以開始于對象不符合核心模型的類型并產(chǎn)生符合核心模型的對象類型。
類型橋可以用各種方法轉(zhuǎn)換CLR對象、Flex對象和Infoset表示。任何給定的類型橋都有所操作的輸入類型和所產(chǎn)生或生成的輸出類型。此輸出被傳遞給管道中的下一個類型橋。對例子類型橋管道400,允許進(jìn)行下面的轉(zhuǎn)換輸入類型 輸出類型 說明CLR CLR 轉(zhuǎn)換CLR對象為新的CLR對象CLR Flex 轉(zhuǎn)換CLR對象為Flex對象CLR Infoset 轉(zhuǎn)換CLR對象為Infoset對象Flex Flex 轉(zhuǎn)換Flex對象為新的Flex對象Flex CLR 轉(zhuǎn)換Flex對象為CLR對象Flex Infoset 轉(zhuǎn)換Flex對象為Infoset對象Infoset Infoset 轉(zhuǎn)換Infoset對象為新的Infoset對象Infoset Flex 轉(zhuǎn)換Infoset對象為Flex對象Infoset CLR 轉(zhuǎn)換Infoset對象為CLR對象創(chuàng)建類型橋的不同分類以提供序列化引擎的基本操作。(雖然圖2和3引用通用的類型,用下面在圖4中展示的特定的類型引用這些圖以提供進(jìn)一步的上下文。
1.序列化轉(zhuǎn)換CLR對象為Infoset對象或表示。為了執(zhí)行此操作,存在包括一個CLR到Flex類型橋(如標(biāo)準(zhǔn)例程250)、任何數(shù)量的Flex到Flex類型橋,和一個Flex到Infoset類型橋(如標(biāo)準(zhǔn)例程270)的類型橋管道(如圖2中所示)。
2.反序列化轉(zhuǎn)換Infoset表示為CLR對象。為了執(zhí)行此操作,存在包括一個Infoset到Flex類型橋(如標(biāo)準(zhǔn)例程350)、任何數(shù)量的Flex到Flex類型橋,和一個Flex到CLR類型橋(如標(biāo)準(zhǔn)例程370)的類型橋管道(如圖2中所示)。
3.對象拷貝被用來創(chuàng)建CLR對象的深層拷貝。為了執(zhí)行此操作,存在包括CLR到CLR類型橋的類型橋管道。
4.對象轉(zhuǎn)換(圖4)創(chuàng)建單個或多個CLR對象(初始對象440)的深層拷貝(結(jié)果對象480),而對實例數(shù)據(jù)(中間表示460A和460B)執(zhí)行可選的轉(zhuǎn)換(標(biāo)準(zhǔn)或定制擴(kuò)展例程)。為了執(zhí)行此操作,存在包括一個CLR到Flex類型橋(標(biāo)準(zhǔn)或定制例程450)、一個或多個可選的執(zhí)行轉(zhuǎn)換的Flex到Flex類型橋(標(biāo)準(zhǔn)或定制擴(kuò)展例程460),和一個Flex到CLR類型橋(標(biāo)準(zhǔn)或定制例程470)的類型橋管道。
5.Infoset轉(zhuǎn)換創(chuàng)建Infoset的拷貝并可選地對其進(jìn)行轉(zhuǎn)換。類似于對象拷貝,為了執(zhí)行此操作,存在包括Infoset到Infoset類型橋的類型橋管道。
最后三個選項由于它們的實現(xiàn)方式而值得注意。盡管其他實現(xiàn)緩沖對象或Infoset數(shù)據(jù),本發(fā)明的實施例可能延遲轉(zhuǎn)換來避免或減少緩沖的需求。因此,可以顯著地改善性能和資源管理。
為了支持上述操作,序列化引擎提供執(zhí)行適當(dāng)轉(zhuǎn)換的常用或基本類型橋。在圖4中,標(biāo)準(zhǔn)或定制例程450、460和470的任何一個都可以為常用類型橋或定制的替換。使用可擴(kuò)展的配置機(jī)制,適當(dāng)?shù)念愋蜆蛟谶\(yùn)行時間被識別出并裝載到管道中。序列化引擎使用這些常用管道來執(zhí)行請求的操作。然而,常用類型橋可以在任何時候被替換,因為引擎使用抽象類型橋的概念,而非具體的常用實現(xiàn)。在一個例子實施例中,管道簡單地包括用于該管道的類型橋的列表-改變該列表改變該管道。對此例子實施例,一旦對一個對象調(diào)用特殊的類型橋,就不對該對象調(diào)用其他類型橋。
注意在例子實施例中,CLR 410、Flex 420和Infoset 430對應(yīng)于如圖2所示的序列化的初始格式210、中間格式220和結(jié)果格式230,并對應(yīng)于如圖3所示的反序列化的結(jié)果類型310、中間類型320和初始類型330。Flex對象是CLR和Infoset兩者之間的中間類型。在此例子實施例中,類型橋不能進(jìn)行從CLR到Infoset或相反的直接轉(zhuǎn)換。和其他特性一起,這幫助簡化例子序列化引擎。雖然序列化引擎的基本功能或操作是由常用類型橋定義的,有開發(fā)者可能需要的很多附加特性(如支持遺留編程模型)。本可以定義常用類型橋來實現(xiàn)這些特性,然而,有幾個常用Flex到Flex類型橋來滿足此目的。此方法確保常用類型橋是簡單和可擴(kuò)展的。因此,不同的開發(fā)者可以對標(biāo)準(zhǔn)特性進(jìn)行修改并提供他們自己的新特性。
對此例子實施例,考慮稱為Person、有兩個屬性FirstName和LastName的CLR類型的序列化處理。為了序列化此類型的實例(參見圖2),需要有常用CLR到Flex和Flex到Infoset類型橋的管道。序列化引擎向CLR到Flex類型橋傳遞Person實例。此類型橋返回基于Person實例的新的Flex對象實例并代理Person實例。然后Flex對象被傳遞給Flex到Infoset類型橋。
Flex到Infoset類型橋負(fù)責(zé)轉(zhuǎn)換或變換Flex對象為Infoset表示。在轉(zhuǎn)換前,常用Flex到Infoset類型橋確定映射Flex對象的結(jié)構(gòu)到Infoset的方式。此例中的常用實現(xiàn)使用大綱語言并用以該語言定義的結(jié)構(gòu)定義映射。由于類型橋是可替換的,可以引入包括支持新大綱語言的新映射機(jī)制,它表示序列化引擎內(nèi)的另一個可擴(kuò)展點。一旦映射處理完成,F(xiàn)lex對象被轉(zhuǎn)換為Infoset表示,Infoset表示被寫入流。
如上簡述,序列化引擎內(nèi)的類型橋被連接到書寫器工廠。書寫器工廠負(fù)責(zé)創(chuàng)建能夠?qū)憯?shù)據(jù)的資源。雖然該資源可以寫數(shù)據(jù)到任何目標(biāo),最常見的目標(biāo)是數(shù)據(jù)流(在用于的序列化之后)和CLR對象(在反序列化之后)。此例子實施例的常用書寫器工廠返回寫到用戶提供的數(shù)據(jù)流的資源。此工廠生成的資源可以用任何它所需的格式寫數(shù)據(jù)流。這樣,并不限于XML序列化格式,這使書寫器工廠可被替換并帶來序列化引擎內(nèi)的又一個可擴(kuò)展點。
在此例子實施例中的Infoset表示的反序列化(例如,參考圖3)包括包含常用Infoset到Flex和Flex到CLR類型橋的管道。序列化引擎?zhèn)鬟f用戶提供的表示源Infoset和CLR類型(Person)流,CLR類型被反序列化到第一種類型橋(Infoset到Flex)。此類型橋基于代理流的Person類型創(chuàng)建新的Flex對象實例。結(jié)果Flex對象被傳遞給Flex到CLR類型橋,此類型橋用來自Flex對象的數(shù)據(jù)產(chǎn)生Person的實例(該Flex對象實際上在流中,因為Flex是代理)。如對序列化那樣,反序列化管道以書寫器工廠結(jié)束。反序列化的常用書寫工廠負(fù)責(zé)創(chuàng)建被反序列化的CLR類型的實例。
除了序列化和反序列化,可能需要轉(zhuǎn)換Person類型。如上所示,Person類型的形狀包括兩個屬性FirstName和LastName。例如,假設(shè)使用Person的這個定義的應(yīng)用和使用不同的Person定義的另一個應(yīng)用(如有一個屬性Fullname的Person)交互。雖然一種選擇是讓兩個應(yīng)用使用同樣的Person類型,但這并不總是可能的(也許兩個應(yīng)用都已被寫出)。
根據(jù)所述的例子實施例,可以創(chuàng)建轉(zhuǎn)換Person實例在一個應(yīng)用中的形狀為另一個應(yīng)用中所需的形狀的類型橋。為了進(jìn)行轉(zhuǎn)換(見圖2),需要構(gòu)建新的Flex到Flex類型橋(如定制擴(kuò)展例程260)并將其放置在序列化管道中的常用CLR到Flex類型橋(如標(biāo)準(zhǔn)例程250)之后。在此序列化處理中,向這個類型橋傳遞代理Person實例的Flex對象。此類型橋構(gòu)建有不同的形狀(單個FullName屬性)新的Flex類型?;诖薋lex類型,創(chuàng)建新的Flex對象,它連接初始Flex對象(它也代理Person實例)的FirstName和LastName屬性。這個Flex對象被傳遞給常用Flex到Infoset類型橋(如,標(biāo)準(zhǔn)例程270),該類型橋序列化一個屬性而不是兩個。值得注意連接實際上沒有被執(zhí)行,直到Flex到Infoset類型橋請求新的FullName屬性的值。因此,轉(zhuǎn)換被延遲,直到創(chuàng)建Infoset或結(jié)果對象。
因此,符合本發(fā)明的序列化引擎可以提供在系統(tǒng)和類型之間進(jìn)行轉(zhuǎn)換的可擴(kuò)展架構(gòu),這包括支持可嵌入的類型和數(shù)據(jù)轉(zhuǎn)換、支持不定的類型和對象、支持可嵌入的大綱類型系統(tǒng)、支持可嵌入的數(shù)據(jù)格式等等。
也可以用包括功能步驟和/或非功能動作的方法來說明本發(fā)明。下面是執(zhí)行以用于實現(xiàn)本發(fā)明的動作和步驟的說明。通常功能步驟以所實現(xiàn)的結(jié)果說明本發(fā)明,而非功能動作說明實現(xiàn)特定結(jié)果的特定動作。雖然功能步驟和非功能步驟可以用特殊的順序來說明或請求,本發(fā)明并不限于任何動作和/或步驟的特殊順序或組合。
圖5A至圖5B展示符合本發(fā)明的序列化和反序列化對象的方法的例子動作和步驟,它可以包括接收由序列化引擎在運(yùn)行時間處理的初始類型的初始對象的動作(512)。識別初始對象的類型信息的步驟(520)可以包括接收類型信息的動作(522)。類型信息可以作為和管理的代碼關(guān)聯(lián)的元數(shù)據(jù)提供?;诔跏碱愋托畔⑥D(zhuǎn)換初始對象為中間表示的步驟(530)可以包括基于類型信息產(chǎn)生(未標(biāo)出)中間表示和調(diào)用(532)一個或多個定制擴(kuò)展例程并調(diào)用(534)一個或多個標(biāo)準(zhǔn)例程來修改中間表示的動作。一個或多個擴(kuò)展例程更改序列化引擎的運(yùn)行時間操作。
應(yīng)注意中間表示可以包括對象名稱、對象類型和/或?qū)ο髷?shù)據(jù)。雖然未示出,修改中間表示的步驟(540)也可以包括調(diào)用(未標(biāo)出)一個或多個定制擴(kuò)展例程和調(diào)用(未標(biāo)出)一個或多個標(biāo)準(zhǔn)例程來修改中間表示的動作。修改中間表示的步驟(540)可以進(jìn)一步包括更改對象名稱、類型和/或數(shù)據(jù)的動作(540)。延遲修改的步驟(550)可以包括指定如何修改中間表示,而無需實際上修改中間表示的動作(552)延遲有助于減少和在內(nèi)存中修改中間結(jié)果關(guān)聯(lián)的緩沖和處理需求。
轉(zhuǎn)換初始對象的中間表示為有結(jié)果類型或格式的結(jié)果對象的步驟(560)可以包括下面的動作。當(dāng)序列化時(563),步驟可以包括創(chuàng)建或產(chǎn)生結(jié)果對象的動作(565)。在一個例子實施例中,如上所述結(jié)果對象被格式化為XML以進(jìn)行傳輸。創(chuàng)建或產(chǎn)生結(jié)果對象(565)從而可以包括產(chǎn)生適當(dāng)?shù)腦ML并將結(jié)果對象寫入流。另外,結(jié)果對象可以被格式化以持續(xù)存儲在硬盤上或格式化為任何其他適合于表示序列化的初始對象的格式。當(dāng)反序列化時(564),步驟可以包括實例化(566)和創(chuàng)建(568)結(jié)果對象的動作。在轉(zhuǎn)換的步驟中(560),調(diào)用定制擴(kuò)展和標(biāo)準(zhǔn)例程進(jìn)行任何延遲的修改,延遲的修改指示應(yīng)如何進(jìn)行更改但實際上不做出更改。
本發(fā)明范圍內(nèi)的實施例也包括承載或包含計算機(jī)可執(zhí)行指令或存儲于其上的數(shù)據(jù)結(jié)構(gòu)的計算機(jī)可讀媒體。這樣的計算機(jī)可讀媒體可以為能由通用或?qū)S糜嬎銠C(jī)訪問的任何可用媒體。作為例子,而非限制,這樣的計算機(jī)可讀媒體包括RAM、ROM、EEPROM、CD-ROM或其他光盤存儲、磁盤存儲或其他磁存儲設(shè)備,或可以用于承載或存儲形式為計算機(jī)可執(zhí)行指令或數(shù)據(jù)結(jié)構(gòu)并且可以由通用或?qū)S糜嬎銠C(jī)訪問的所需程序代碼方法的任何其他媒體。當(dāng)通過網(wǎng)絡(luò)或其他通訊連接傳輸(有線、無線或兩者的組合)或提供信息到計算機(jī)時,計算機(jī)正確地視該連接為計算機(jī)可讀媒體。因此,任何這樣的連接都被正確地稱為計算機(jī)可讀媒體。上述的組合也可以包括在計算機(jī)可讀媒體的范圍內(nèi)。計算機(jī)可執(zhí)行指令包括,例如,使通用計算機(jī)、專用計算機(jī)或?qū)S锰幚碓O(shè)備執(zhí)行特定功能或功能組的指令和數(shù)據(jù)。
圖6和下面的說明旨在提供對在其中可以實現(xiàn)本發(fā)明的適合的計算環(huán)境的簡短的總體說明。雖然不是必須的,本發(fā)明可以在計算機(jī)可執(zhí)行指令的一般性上下文中進(jìn)行說明,如由網(wǎng)絡(luò)環(huán)境中的計算機(jī)執(zhí)行的程序模塊。通常,程序模塊包括執(zhí)行特殊任務(wù)或?qū)崿F(xiàn)特殊抽象數(shù)據(jù)類型的例程、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)等等。計算機(jī)可執(zhí)行指令、關(guān)聯(lián)的數(shù)據(jù)結(jié)構(gòu)及程序模塊代表執(zhí)行在此揭示的方法的步驟的程序代碼方法的例子。這樣的可執(zhí)行指令的特殊序列或關(guān)聯(lián)的數(shù)據(jù)結(jié)構(gòu)代表對應(yīng)的實現(xiàn)以這樣的步驟說明的功能的動作的例子。
熟悉技術(shù)的人應(yīng)理解,本發(fā)明可以實現(xiàn)在由多種計算機(jī)系統(tǒng)配置的網(wǎng)絡(luò)計算環(huán)境中,多種計算機(jī)系統(tǒng)配置包括個人計算機(jī)、手持設(shè)備、多處理器系統(tǒng)、基于微處理器的或可編程的消費(fèi)者電子設(shè)備、網(wǎng)絡(luò)PC、小型機(jī)、大型機(jī)等等。本發(fā)明也可以實現(xiàn)在分布式計算環(huán)境中,其中任務(wù)由本地和通過通訊網(wǎng)絡(luò)(通過有線連接、無線連接、或有線或連接的組合)連接的遠(yuǎn)程處理設(shè)備執(zhí)行。在分布式計算環(huán)境中,程序模塊可以位于本地和遠(yuǎn)程存儲器存儲設(shè)備。
參考圖6,用于實現(xiàn)本發(fā)明的例子系統(tǒng)包括形式為常規(guī)計算機(jī)620的通用計算設(shè)備,它包括處理單元621、系統(tǒng)存儲器622和將包括系統(tǒng)存儲器622的各種系統(tǒng)組件連接到處理單元的系統(tǒng)總線623。系統(tǒng)總線可以為幾種類型的總線結(jié)構(gòu)之一,包括存儲器總線或存儲器控制器、外圍總線和使用多種總線結(jié)構(gòu)之一的本地總線。系統(tǒng)存儲器包括只讀存儲器(ROM)624和隨即訪問存儲器(RAM)625?;据斎?輸出系統(tǒng)(BIOS)626可以被存儲在ROM 624內(nèi),它包含幫助在計算機(jī)620內(nèi)的元件之間傳輸信息,如在啟動時,的基本例程。
計算機(jī)620也可以包括讀寫磁硬盤639的磁硬盤驅(qū)動器627、讀寫可移動磁盤629的磁盤驅(qū)動器628和讀或?qū)懭鏑D-ROM或其他光學(xué)媒體這樣的可移動光盤631的光盤驅(qū)動器630。磁硬盤驅(qū)動器627、磁盤驅(qū)動器628和光盤驅(qū)動器630分別通過硬盤驅(qū)動器接口632、磁盤驅(qū)動器接口633和光盤驅(qū)動器接口634連接到系統(tǒng)總線623。驅(qū)動器及與其關(guān)聯(lián)的計算機(jī)可讀媒體對計算機(jī)620提供計算機(jī)可執(zhí)行指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊和其他數(shù)據(jù)的非易失存儲。雖然在此所述的典型環(huán)境使用磁硬盤639、可移動磁盤629和可移動光盤631,可以使用其他類型的計算機(jī)可讀媒體來存儲數(shù)據(jù),包括盒式磁帶、閃存卡、數(shù)字多用途盤、伯努利盒、RAM、ROM等等。
程序代碼方法包括可以被存儲在硬盤639、磁盤629、光盤631、ROM 624或RAM 625上的一個或多個程序模塊,包括操作系統(tǒng)635、一個或多個應(yīng)用程序636、其他程序模塊637和程序數(shù)據(jù)638。用戶可以通過鍵盤640、定點設(shè)備642或其他輸入設(shè)備(未標(biāo)出),如麥克風(fēng)、操縱桿、游戲墊、圓盤式衛(wèi)星天線、掃描儀等等來輸入命令和信息到計算機(jī)620中。這些和其他輸入設(shè)備通常通過連接到系統(tǒng)總線623的串行口接口656連接到處理單元621。另外,輸入接口可以通過其他接口連接,如并行口、游戲口或通用串行總線(USB)。監(jiān)視器847或另一個顯示設(shè)備也通過接口,如視頻接口68連接到系統(tǒng)總線623。除了監(jiān)視器,個人計算機(jī)通常包括其他外圍輸出設(shè)備(未標(biāo)出),如揚(yáng)聲器和打印機(jī)。
計算機(jī)620可以使用到一個或多個遠(yuǎn)程計算機(jī),如遠(yuǎn)程計算機(jī)649a和649b的邏輯連接工作在聯(lián)網(wǎng)環(huán)境中。遠(yuǎn)程計算機(jī)649a和649b的每一個都可以為個人計算機(jī)、服務(wù)器、路由器、網(wǎng)絡(luò)PC、對等設(shè)備或其他普通網(wǎng)絡(luò)節(jié)點,并通常包括上述相對于計算機(jī)620說明的很多或所有元件,雖然在圖6中只展示了存儲器存儲設(shè)備650a和650b及與其關(guān)聯(lián)的應(yīng)用程序636a和636b。在圖6中所示的邏輯連接包括局域網(wǎng)(LAN)651和廣域網(wǎng)(WAN)652,在此作為例子展示,而非限制。這樣的聯(lián)網(wǎng)環(huán)境在辦公室范圍或企業(yè)范圍的計算機(jī)網(wǎng)絡(luò)、企業(yè)內(nèi)部互聯(lián)網(wǎng)和因特網(wǎng)中是很常見的。
當(dāng)用在LAN聯(lián)網(wǎng)環(huán)境中時,計算機(jī)620通過網(wǎng)絡(luò)接口或適配器653連接到本地網(wǎng)絡(luò)651。當(dāng)用在WAN聯(lián)網(wǎng)環(huán)境中時,計算機(jī)620可以包括調(diào)制解調(diào)器654、無線連接或在廣域網(wǎng)652,如因特網(wǎng)上建立通訊的其他方法。調(diào)制解調(diào)器654可以為內(nèi)置的或外置的,通過串行口接口656連接到系統(tǒng)總線623。在聯(lián)網(wǎng)的環(huán)境中,相對于計算機(jī)620說明的程序模塊,或其部分,可以被存儲在遠(yuǎn)程存儲器存儲設(shè)備。應(yīng)理解,所示的網(wǎng)絡(luò)連接是示范性的且可以使用通過廣域網(wǎng)652建立通訊的其他方法。
本發(fā)明可以用其他具體形式實現(xiàn)而不偏離其精神或本質(zhì)特征。所述的實施例應(yīng)被視為在所有的方面都是說明性的,而不是限制性的。因此,本發(fā)明的范圍由后附的權(quán)利要求而非上述的說明來指明。落在權(quán)利要求的等價意義和范圍內(nèi)的所有的更改包括在本發(fā)明的范圍之內(nèi)。
權(quán)利要求
1.在包括能夠序列化和反序列化各種類型數(shù)據(jù)對象的可擴(kuò)展序列化引擎的計算系統(tǒng)中,轉(zhuǎn)換初始類型的初始對象為結(jié)果類型的結(jié)果對象的方法,其中所述方法允許運(yùn)行序列化引擎的運(yùn)行時間操作由一個或多個擴(kuò)展例程更改,而無需替換序列化引擎的整體實現(xiàn),所述方法包括動作接收初始類型的初始對象由序列化引擎在運(yùn)行時間進(jìn)行處理;接收初始類型的初始對象的類型信息;基于所述類型信息,產(chǎn)生初始對象的中間表示,所述中間表示適合于進(jìn)行運(yùn)行時間修改;調(diào)用一個或多個定制擴(kuò)展例程來改變初始對象的所述中間表示,從而更改序列化引擎的運(yùn)行時間操作;及通過初始對象修改的中間表示,產(chǎn)生結(jié)果類型的結(jié)果對象。
2.如權(quán)利要求1所述的方法,其特征在于,所述中間表示包括初始對象的整體類型,和包含在初始對象內(nèi)的一個或多個對象的對象名稱、對象類型和對象數(shù)據(jù)。
3.如權(quán)利要求2所述的方法,其特征在于,進(jìn)一步包括改變整體對象類型和包含在初始對象內(nèi)的一個或多個對象的對象名稱、對象類型和對象數(shù)據(jù)中的至少一個的動作。
4.如權(quán)利要求1所述的方法,其特征在于,進(jìn)一步包括調(diào)用一個或多個標(biāo)準(zhǔn)例程來修改初始對象的中間表示的動作。
5.如權(quán)利要求1所述的方法,其特征在于,所述修改初始對象的中間表示基于所述類型信息內(nèi)的特殊模式。
6.如權(quán)利要求1所述的方法,其特征在于,所述修改初始對象的中間表示基于初始對象內(nèi)的對象數(shù)據(jù)。
7.如權(quán)利要求1所述的方法,其特征在于,所述序列化引擎是分布式應(yīng)用的消息系統(tǒng)的部分,所述應(yīng)用程序發(fā)送和接收一個或多個消息,且所述初始對象和結(jié)果對象表示消息的至少部分。
8.如權(quán)利要求1所述的方法,其特征在于,所述初始對象包括內(nèi)存中的對象,及所述序列化引擎序列化用于初始對象來產(chǎn)生結(jié)果對象。
9.如權(quán)利要求1所述的方法,其特征在于,所述結(jié)果對象包括基于初始對象進(jìn)行實例化和產(chǎn)生的內(nèi)存中的對象,及所述序列化引擎用于反序列化初始對象來產(chǎn)生結(jié)果對象。
10.如權(quán)利要求1所述的方法,其特征在于,調(diào)用所述一個或多個定制擴(kuò)展例程來改變所述中間表示,所述定制擴(kuò)展例程指定如何改變中間表示,而無需實際上改變中間表示,以使得中間表示中的改變得到延遲,直到產(chǎn)生結(jié)果對象,以減少緩沖的需求。
11.對包括能夠序列化和反序列化各種類型數(shù)據(jù)對象的可擴(kuò)展序列化引擎的計算系統(tǒng),計算機(jī)程序產(chǎn)品包括一個多多個計算機(jī)可讀媒體,所述計算機(jī)可讀媒體承載計算機(jī)可執(zhí)行指令,所述計算機(jī)可執(zhí)行指令實現(xiàn)轉(zhuǎn)換初始類型的初始對象為結(jié)果類型的結(jié)果對象的方法,其中所述方法允許運(yùn)行序列化引擎的運(yùn)行時間操作由一個或多個擴(kuò)展例程更改,而無需替換序列化引擎的整體實現(xiàn),所述方法包括動作接收初始類型的初始對象由序列化引擎在運(yùn)行時間進(jìn)行處理;接收初始類型的初始對象的類型信息;基于所述類型信息,產(chǎn)生初始對象的中間表示,所述中間表示適合于進(jìn)行運(yùn)行時間修改;調(diào)用一個或多個定制擴(kuò)展例程來改變初始對象的所述中間表示,從而更改序列化引擎的運(yùn)行時間操作;及通過初始對象修改的中間表示,產(chǎn)生結(jié)果類型的結(jié)果對象。
12.如權(quán)利要求11所述的計算機(jī)程序產(chǎn)品,其特征在于,所述中間表示包括初始對象的整體類型,和包含在初始對象內(nèi)的一個或多個對象的對象名稱、對象類型和對象數(shù)據(jù)。
13.如權(quán)利要求12所述的計算機(jī)程序產(chǎn)品,其特征在于,所述方法進(jìn)一步包括改變整體對象類型和包含在初始對象內(nèi)的一個或多個對象的對象名稱、對象類型和對象數(shù)據(jù)中的至少一個的動作。
14.如權(quán)利要求11所述的計算機(jī)程序產(chǎn)品,其特征在于,所述方法進(jìn)一步包括調(diào)用一個或多個可替換的標(biāo)準(zhǔn)例程來修改初始對象的中間表示的動作。
15.如權(quán)利要求11所述的計算機(jī)程序產(chǎn)品,其特征在于,所述修改初始對象的中間表示基于所述類型信息內(nèi)的特殊模式、元數(shù)據(jù)和初始對象內(nèi)的對象數(shù)據(jù)之一。
16.如權(quán)利要求11所述的計算機(jī)程序產(chǎn)品,其特征在于,其中如果初始對象包括內(nèi)存中的對象,則所述序列化引擎用于序列化初始對象來產(chǎn)生結(jié)果對象,且如果結(jié)果對象包括基于初始對象進(jìn)行實例化并產(chǎn)生的內(nèi)存中的對象,則所述序列化引擎用于反序列化初始對象來產(chǎn)生結(jié)果對象。
17.如權(quán)利要求11所述的計算機(jī)程序產(chǎn)品,其特征在于,所述初始對象和結(jié)果對象兩者均為內(nèi)存中的對象。
18.如權(quán)利要求11所述的計算機(jī)程序產(chǎn)品,其特征在于,調(diào)用所述一個或多個定制擴(kuò)展例程來改變所述中間表示,所述定制擴(kuò)展例程指定如何改變中間表示,而無需實際上改變中間表示,以使得中間表示中的改變得到延遲,直到產(chǎn)生結(jié)果對象,以減少緩沖的需求。
19.在包括序列化和反序列化各種類型數(shù)據(jù)對象的可擴(kuò)展序列化引擎的計算系統(tǒng)中,轉(zhuǎn)換初始類型的初始對象為結(jié)果類型的結(jié)果對象的方法,其中所述方法允許運(yùn)行序列化引擎的運(yùn)行時間操作由一個或多個擴(kuò)展例程更改,而無需替換序列化引擎的一個或多個其他現(xiàn)有例程,所述方法包括步驟識別接收用于由序列化引擎在運(yùn)行時間進(jìn)行處理的初始類型的初始對象的類型信息;基于所述類型信息,轉(zhuǎn)換初始對象為初始對象的中間表示,所述中間表示適合于運(yùn)行時間修改;根據(jù)一個或多個擴(kuò)展例程修改初始對象的中間表示,從而更改序列化引擎的運(yùn)行時間操作;及轉(zhuǎn)換初始對象的中間表示為結(jié)果類型的結(jié)果對象。
20.如權(quán)利要求19所述的方法,其特征在于,所述初始對象的中間表示至少包括對象名稱、對象類型和對象數(shù)據(jù)中的一個。
21.如權(quán)利要求20所述的方法,其特征在于,所述根據(jù)一個或多個擴(kuò)展例程修改初始對象的中間表示的步驟,包括至少修改對象名稱、對象類型和對象數(shù)據(jù)中的一個。
22.如權(quán)利要求19所述的方法,其特征在于,進(jìn)一步包括根據(jù)序列化引擎內(nèi)的一個或多個標(biāo)準(zhǔn)例程修改初始對象的中間表示的步驟。
23.如權(quán)利要求19所述的方法,其特征在于,所述修改初始對象中間表示基于類型信息內(nèi)的特殊模式、初始對象內(nèi)的對象數(shù)據(jù),或兩者。
24.如權(quán)利要求19所述的方法,其特征在于,所述初始對象包括內(nèi)存中的對象且序列化引擎序列化初始對象來產(chǎn)生結(jié)果對象。
25.如權(quán)利要求19所述的方法,其特征在于,所述初始對象和結(jié)果對象兩者均為內(nèi)存中的對象。
26.如權(quán)利要求19所述的方法,其特征在于,進(jìn)一步包括延遲修改中間表示,直到中間表示被轉(zhuǎn)換為結(jié)果對象,以避免對中間表示的修改進(jìn)行緩沖的步驟。
27.對包括能夠序列化和反序列化各種類型數(shù)據(jù)對象的可擴(kuò)展序列化引擎的計算系統(tǒng),計算機(jī)程序產(chǎn)品包括一個或多個計算機(jī)可讀媒體,所述計算機(jī)可讀媒體承載計算機(jī)可執(zhí)行指令,所述計算機(jī)可執(zhí)行指令實現(xiàn)轉(zhuǎn)換初始類型的初始對象為結(jié)果類型的結(jié)果對象的方法,其中所述方法允許運(yùn)行序列化引擎的運(yùn)行時間操作由一個或多個擴(kuò)展例程更改,而無需替換序列化引擎的一個或多個其他現(xiàn)有例程,所述方法包括動作識別接收用于由序列化引擎在運(yùn)行時間進(jìn)行處理的初始類型的初始對象的類型信息;基于所述類型信息,轉(zhuǎn)換初始對象為初始對象的中間表示,所述中間表示適合于運(yùn)行時間修改;根據(jù)一個或多個擴(kuò)展例程修改初始對象的中間表示,從而更改序列化引擎的運(yùn)行時間操作;及轉(zhuǎn)換初始對象的中間表示為結(jié)果類型的結(jié)果對象。
28.如權(quán)利要求27所述的計算機(jī)程序產(chǎn)品,其特征在于,所述初始對象的中間表示至少包括對象名稱、對象類型和對象數(shù)據(jù)中的一個。
29.如權(quán)利要求27所述的計算機(jī)程序產(chǎn)品,其特征在于,所述根據(jù)一個或多個擴(kuò)展例程修改初始對象的中間表示的步驟,包括至少修改對象名稱、對象類型和對象數(shù)據(jù)中的一個。
30.如權(quán)利要求27所述的計算機(jī)程序產(chǎn)品,其特征在于,進(jìn)一步包括根據(jù)序列化引擎內(nèi)的一個或多個標(biāo)準(zhǔn)例程修改初始對象的中間表示的步驟。
31.如權(quán)利要求27所述的計算機(jī)程序產(chǎn)品,其特征在于,所述修改初始對象中間表示基于類型信息內(nèi)的特殊模式、初始對象內(nèi)的對象數(shù)據(jù),或兩者。
32.如權(quán)利要求27所述的計算機(jī)程序產(chǎn)品,其特征在于,所述結(jié)果對象包括內(nèi)存中的對象且反序列化引擎序列化初始對象來產(chǎn)生結(jié)果對象。
33.如權(quán)利要求27所述的計算機(jī)程序產(chǎn)品,其特征在于,所述初始對象和結(jié)果對象兩者均為內(nèi)存中的對象。
34.如權(quán)利要求27所述的計算機(jī)程序產(chǎn)品,其特征在于,進(jìn)一步包括延遲修改中間表示,直到中間表示被轉(zhuǎn)換為結(jié)果對象,以避免對中間表示的修改進(jìn)行緩沖的步驟。
35.一種實現(xiàn)轉(zhuǎn)換一個或多個初始類型的初始對象為一個或多個結(jié)果類型的結(jié)果對象的可擴(kuò)展序列化引擎的計算機(jī)程序產(chǎn)品,其中可以更改運(yùn)行序列化引擎的運(yùn)行時間操作,而無需重新實現(xiàn)序列化引擎的現(xiàn)有部分,所述計算機(jī)產(chǎn)品包括一個或多個計算機(jī)可讀媒體,所述計算機(jī)可讀媒體承載形式為計算機(jī)模塊的計算機(jī)可執(zhí)行指令,所述程序模塊包括運(yùn)行時間可替換的反映模塊,所述反映模塊用于識別由序列化引擎接收在運(yùn)行時間進(jìn)行處理的初始類型的初始對象的類型信息;一個或多個運(yùn)行時間可替換的轉(zhuǎn)換模塊,所述轉(zhuǎn)換模塊用于產(chǎn)生和基于所識別的類型信息修改初始對象的中間表示,其中一個或多個運(yùn)行時間可替換的轉(zhuǎn)換模塊包括一個或多個更改序列化引擎的運(yùn)行時間操作的擴(kuò)展例程;及運(yùn)行時間可替換的產(chǎn)生模塊,所述產(chǎn)生模塊用于通過由轉(zhuǎn)換模塊產(chǎn)生的中間表示創(chuàng)建結(jié)果類型的結(jié)果對象。
36.如權(quán)利要求35所述的計算機(jī)程序產(chǎn)品,其特征在于,所述中間表示包括初始對象的對象名稱、對象類型和對象數(shù)據(jù),以及任何包含在初始對象內(nèi)的對象。
37.如權(quán)利要求35所述的計算機(jī)程序產(chǎn)品,其特征在于,所述一個或多個運(yùn)行時間可替換的轉(zhuǎn)換模塊能夠改變初始對象的對象名稱、對象類型和對象數(shù)據(jù)以及任何包含在初始對象內(nèi)的對象中的至少一個。
38.如權(quán)利要求37所述的計算機(jī)程序產(chǎn)品,其特征在于,所述一個或多個運(yùn)行時間可替換的轉(zhuǎn)換模塊能夠追蹤有關(guān)初始對象的信息,而不修改中間表示。
39.如權(quán)利要求35所述的計算機(jī)程序產(chǎn)品,其特征在于,所述一個或多個運(yùn)行時間可替換的轉(zhuǎn)換模塊包括一個或多個標(biāo)準(zhǔn)例程來修改中間表示。
40.如權(quán)利要求35所述的計算機(jī)程序產(chǎn)品,其特征在于,所述一個或多個運(yùn)行時間可替換的轉(zhuǎn)換模塊能夠基于類型信息內(nèi)的特殊模式、初始對象內(nèi)的對象數(shù)據(jù),或兩者來修改初始對象的中間表示。
41.如權(quán)利要求35所述的計算機(jī)程序產(chǎn)品,其特征在于,所述運(yùn)行時間可替換的產(chǎn)生模塊能夠以可擴(kuò)展標(biāo)記語言(XML)格式創(chuàng)建結(jié)果對象。
42.如權(quán)利要求35所述的計算機(jī)程序產(chǎn)品,其特征在于,所述運(yùn)行時間可替換的產(chǎn)生模塊能夠基于中間表示實例化并產(chǎn)生結(jié)果對象。
43.如權(quán)利要求35所述的計算機(jī)程序產(chǎn)品,其特征在于,所述一個或多個運(yùn)行時間可替換的轉(zhuǎn)換模塊能夠延遲對初始對象的中間表示的一個或多個修改,直到中間表示被轉(zhuǎn)換為結(jié)果對象,以避免和對中間表示做出所述一個或多個修改關(guān)聯(lián)的緩沖需求。
全文摘要
將一種類型的對象轉(zhuǎn)換為另一種類型的對象而允許更改或定制轉(zhuǎn)換處理的運(yùn)行時間操作的方法、系統(tǒng)和計算機(jī)程序產(chǎn)品。轉(zhuǎn)換可以在可擴(kuò)展的序列化引擎之內(nèi)進(jìn)行,序列化引擎序列化、反序列化并轉(zhuǎn)換各種類型的對象。序列化引擎的運(yùn)行時間操作由實現(xiàn)所需定制或擴(kuò)展的一個或多個擴(kuò)展例程來更改,而無需替換其他現(xiàn)有的例程?;趯Τ跏紝ο笏R別的類型信息,將該對象轉(zhuǎn)換為允許運(yùn)行時間修改的中間表示,運(yùn)行時間修改包括對象名稱、對象類型和對象數(shù)據(jù)的修改。根據(jù)擴(kuò)展例程修改初始對象的中間表示,所述擴(kuò)展例程更改序列化引擎的運(yùn)行時間操作,且所述中間表示被轉(zhuǎn)換為結(jié)果對象和類型。
文檔編號G06F12/00GK1534456SQ20041003232
公開日2004年10月6日 申請日期2004年3月26日 優(yōu)先權(quán)日2003年3月26日
發(fā)明者S·H·法里斯, S H 法里斯, S·K·斯里尼瓦杉, 斯里尼瓦杉, N·H·杰沙南達(dá)尼, 杰沙南達(dá)尼, Y·E·克里斯騰森, 克里斯騰森, E·A·卡里提迪, 卡里提迪, D·M·普迪, 普迪 申請人:微軟公司