專利名稱:文檔的二進(jìn)制串行化的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及用于處理電子文檔的方法和系統(tǒng),尤其涉及用于將文檔串行化和反串行化以支持傳輸或存儲(chǔ)的方法和系統(tǒng)。
背景技術(shù):
可擴(kuò)展標(biāo)記語(yǔ)言(XML)可用來(lái)便于實(shí)現(xiàn)基于集成的可編程萬(wàn)維網(wǎng)(“Web”)的服務(wù)。通過(guò)XML相關(guān)消息的交換,服務(wù)可描述它們的能力,并允許其它服務(wù)、應(yīng)用程序或設(shè)備容易地調(diào)用那些能力。已開(kāi)發(fā)出簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議(SOAP)來(lái)促進(jìn)此目標(biāo)。SOAP是在因特網(wǎng)上橋接不同的對(duì)象模型、并為Web服務(wù)相互通信提供一種開(kāi)放式機(jī)制的一種基于XML的機(jī)制。
XML提供一種用于描述結(jié)構(gòu)化數(shù)據(jù)的格式,它是一種形式上類似于超文本標(biāo)記語(yǔ)言(HTML)的標(biāo)記語(yǔ)言,因?yàn)樗且环N基于標(biāo)簽的語(yǔ)言。但是,和HTML不同,XML標(biāo)簽不是預(yù)定義的,從而允許比HTML可能達(dá)到的更大的靈活性。通過(guò)提供定義標(biāo)簽和標(biāo)簽之間的結(jié)構(gòu)關(guān)系的工具,XML支持富結(jié)構(gòu)化Web文檔的創(chuàng)建。
XML標(biāo)準(zhǔn)描述一類稱為XML文檔的數(shù)據(jù)對(duì)象,并部分地描述了處理該類對(duì)象的計(jì)算機(jī)程序的行為。XML文檔是由稱為實(shí)體的存儲(chǔ)單元組成,這些實(shí)體包含經(jīng)語(yǔ)法分析或未經(jīng)語(yǔ)法分析的數(shù)據(jù)。經(jīng)語(yǔ)法分析的數(shù)據(jù)是由字符組成的,其中一些構(gòu)成字符數(shù)據(jù),一些構(gòu)成標(biāo)記。標(biāo)記將文檔的存儲(chǔ)布局和邏輯結(jié)構(gòu)的描述編碼。XML提供一種對(duì)存儲(chǔ)布局和邏輯結(jié)構(gòu)施加約束的機(jī)制。
XML“元素”是結(jié)構(gòu)構(gòu)造,其中包括開(kāi)始標(biāo)簽、結(jié)束或關(guān)閉標(biāo)簽、以及標(biāo)簽之間所包含的信息或內(nèi)容。“開(kāi)始標(biāo)簽”被格式化為“<標(biāo)簽名>”,而“結(jié)束標(biāo)簽”被格式化為“</標(biāo)簽名>”。
在XML文檔中,開(kāi)始和結(jié)束標(biāo)簽可被嵌套在其它開(kāi)始和結(jié)束標(biāo)簽內(nèi)。在特定元素內(nèi)出現(xiàn)的所有元素的開(kāi)始和結(jié)束標(biāo)簽都出現(xiàn)在該特定元素的結(jié)束標(biāo)簽之前。這定義了一種樹(shù)狀結(jié)構(gòu)。每個(gè)元素構(gòu)成此樹(shù)中的一個(gè)節(jié)點(diǎn),并可能具有“子”或“分支”節(jié)點(diǎn)。子節(jié)點(diǎn)表示“父”節(jié)點(diǎn)的開(kāi)始和結(jié)束標(biāo)簽之間出現(xiàn)的任何XML元素。
XML的一種示例性用途是諸如客戶機(jī)和服務(wù)器計(jì)算機(jī)等不同實(shí)體之間請(qǐng)求和響應(yīng)形式的數(shù)據(jù)交換??蛻魴C(jī)可生成對(duì)信息的請(qǐng)求或?qū)δ硞€(gè)服務(wù)器動(dòng)作的請(qǐng)求,而服務(wù)器可生成包含該信息或確認(rèn)該動(dòng)作是否已被執(zhí)行的對(duì)客戶機(jī)的響應(yīng)。這些請(qǐng)求和響應(yīng)的內(nèi)容是XML文檔的形式,即,符合XML規(guī)范的字符序列。
SOAP規(guī)范定義了傳遞經(jīng)XML編碼的數(shù)據(jù)的一種統(tǒng)一方法。它還定義了使用HTTP作為底層通信協(xié)議來(lái)執(zhí)行遠(yuǎn)程過(guò)程調(diào)用(RPC)的一種方法。
SOAP消息是XML文檔,它包括強(qiáng)制性的SOAP信封、可任選的SOAP頭部、以及強(qiáng)制性的SOAP主體。SOAP提供用于在服務(wù)器、服務(wù)、組件和對(duì)象上調(diào)用方法的協(xié)議規(guī)范。SOAP將使用XML和HTTP的現(xiàn)有實(shí)施編碼為一種方法調(diào)用機(jī)制。SOAP規(guī)范要求少量便于防火墻/代理過(guò)濾的HTTP頭部。SOAP規(guī)范還要求用于表示方法參數(shù)、返回值和異常的XML詞匯表。
SOAP提供一種開(kāi)放式的、可擴(kuò)展的方式,以使應(yīng)用程序使用基于XML的消息在Web上通信,而無(wú)論特定的應(yīng)用程序可能使用什么操作系統(tǒng)、對(duì)象模型或語(yǔ)言。SOAP通過(guò)用標(biāo)準(zhǔn)XML定義一種簡(jiǎn)單的、可擴(kuò)展的消息格式并由此提供一種在HTTP上發(fā)送該XML消息的方法,來(lái)便于通用通信。
“XML信息集”(XML infoset)是XML文檔的抽象表示(在例如http://www.w3.org/TR/2004/REC-xml-infoset-20040204描述)。XML文檔的信息集包括信息項(xiàng),信息集可被視為該XML文檔的信息內(nèi)容,而對(duì)該XML文檔的格式?jīng)]有限制。
以下是示例性信息集。示例性信息集“Book”(書)的根元素包含一個(gè)稱為“Price”(價(jià)格)的屬性?!癙rice”屬性有值“35”。該根元素還包含值為“Warand Peace”的文本類型的內(nèi)容。XML標(biāo)準(zhǔn)(在例如http://www.w3.org/TR/REC-xml/描述)指定如何將信息集串行化為文本。例如,該示例性信息集可被串行化如下<Book Price=”35”>War and Peace</Book>
為了傳輸或存儲(chǔ),此文本XML通常被編碼成表示對(duì)應(yīng)文本的字節(jié)。一些文本轉(zhuǎn)換標(biāo)準(zhǔn)包括ASCII Unicode、UTF8和UTF6。例如,以上文本XML文檔可經(jīng)由ASCII編碼來(lái)發(fā)送,如下所發(fā)送的第一字節(jié)60(‘<’的ASCII碼)所發(fā)送的第二字節(jié)66(‘B’的ASCII碼)所發(fā)送的第三字節(jié)111(‘o’的ASCII碼)
所發(fā)送的第四字節(jié)111(‘o’的ASCII碼)所發(fā)送的第五字節(jié)107(‘k’的ASCII碼)等等……由此,通常,XML信息集的存儲(chǔ)器中的表示被串行化為文本XML串;然后,文本串的字符被編碼為對(duì)應(yīng)的字節(jié)以進(jìn)行傳輸。在逆向過(guò)程中,所接收的文本相關(guān)的XML字節(jié)被解碼為對(duì)應(yīng)的文本XML串,它被反串行化并被存儲(chǔ),以提供XML信息集的存儲(chǔ)器中的表示。
XML信息集的存儲(chǔ)器中的表示邏輯地存在,但無(wú)需物理地存在。即,與信息集相關(guān)聯(lián)的項(xiàng)無(wú)需在串行化以前存在于任何物理位置。
例如,基于面向?qū)ο蟮恼Z(yǔ)言的程序可包括串行化和/或反串行化XML文檔的代碼。例如,串行化以上示例的面向?qū)ο蟮拇a可以是XmlWriter.WriteStartElement(“Book”);XmlWriter.WriteAttribute(“Price”,someDatabase.LookUpPriceForBook(“WarAndPeace”));XmlWriter.WriteElementContents(“War and Peace”);XmlWriter.WriteEndElement();“Xml.Writer”方法產(chǎn)生表示文本XML文檔的字節(jié)<Book Price=”35”>War and Peace</Book>.
XML標(biāo)準(zhǔn)提供XML信息項(xiàng)的相對(duì)簡(jiǎn)單的串行化,以及人類可讀的文本串行化的文檔。但是,這些文檔可能是冗長(zhǎng)且處理效率低下的。
發(fā)明內(nèi)容
本發(fā)明的一些實(shí)施例來(lái)自對(duì)以下事實(shí)的認(rèn)識(shí)即,基于電子的文檔能以可減少串行化的文檔的大小、提高處理速度、和/或減少傳遞所需時(shí)間的方式被串行化和/或反串行化。在這些實(shí)施例里的一部分中,通過(guò)使用將信息與二進(jìn)制數(shù)據(jù)單元標(biāo)識(shí)符相關(guān)聯(lián)的字典,XML文檔被串行化為二進(jìn)制格式。這些標(biāo)識(shí)符可標(biāo)識(shí)例如,已知的串、重復(fù)的串、重復(fù)的結(jié)構(gòu)、原語(yǔ)類型、和/或構(gòu)造。
一些實(shí)施例使用靜態(tài)和/或動(dòng)態(tài)字典。靜態(tài)字典可包括預(yù)定義的關(guān)聯(lián)。動(dòng)態(tài)字典可包括帶內(nèi)和/或帶外關(guān)聯(lián)。帶內(nèi)關(guān)聯(lián)可被包括在串行化的XML文檔中,而帶外關(guān)聯(lián)可例如獨(dú)立于使用帶外字典條目的串行化的XML文檔而發(fā)送。
由此,本發(fā)明的一些實(shí)施例為例如XML文檔和SOAP消息提供替換的串行化格式,這些格式用標(biāo)準(zhǔn)XML的人類可讀性和冗長(zhǎng)性換取串行化的文檔的大小、語(yǔ)法分析、以及生成速度的改善。
其中一些實(shí)施例通過(guò)減少或消除XML編碼/解碼過(guò)程中的冗余信息,來(lái)實(shí)現(xiàn)XML文檔的二進(jìn)制虛擬表示的高效流式傳輸。無(wú)需對(duì)整個(gè)XML的內(nèi)容有先驗(yàn)知識(shí)即可消除冗余。串行化的文檔仍可與文本XML文檔具有直接對(duì)應(yīng)關(guān)系。即,二進(jìn)制XML格式的一個(gè)實(shí)施例允許使用其調(diào)用類似于對(duì)文本XML讀出器或?qū)懭肫鞯恼{(diào)用的讀出器或?qū)懭肫鬈浖_@些調(diào)用的用戶無(wú)需知道底層的二進(jìn)制串行化過(guò)程。
由此,本發(fā)明的一個(gè)實(shí)施例的特征是一種用于在基于計(jì)算機(jī)的系統(tǒng)中處理XML文檔的方法。該方法包括將信息項(xiàng)與對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)單元相關(guān)聯(lián),并提供與包括這些信息項(xiàng)中的一個(gè)或多個(gè)的XML信息相關(guān)聯(lián)的XML文檔。該方法還包括將XML文檔串行化為二進(jìn)制XML格式,或?qū)ML文檔從二進(jìn)制XML格式反串行化。串行化包括將XML信息集的一個(gè)或多個(gè)信息項(xiàng)轉(zhuǎn)換成其所對(duì)應(yīng)的一個(gè)或多個(gè)二進(jìn)制數(shù)據(jù)單元。反串行化包括將二進(jìn)制XML格式的一個(gè)或多個(gè)二進(jìn)制數(shù)據(jù)單元轉(zhuǎn)換成其所對(duì)應(yīng)的一個(gè)或多個(gè)信息項(xiàng)。
本發(fā)明的另一個(gè)實(shí)施例的特征是一種用在至少一個(gè)處理器上執(zhí)行的程序編碼的計(jì)算機(jī)可讀介質(zhì)。當(dāng)在該至少一個(gè)處理器上執(zhí)行該程序時(shí),它可執(zhí)行上述用于處理XML文檔的方法。
附圖并非試圖按比例繪制。在附圖中,在各個(gè)圖中示出的每個(gè)完全相同或幾乎相同的組件由相同的標(biāo)號(hào)表示。為清楚起見(jiàn),可能并不在每個(gè)圖中標(biāo)出每個(gè)組件。在附圖中圖1是根據(jù)本發(fā)明的一個(gè)實(shí)施例用于處理XML文檔的方法的流程圖;圖2是根據(jù)本發(fā)明的一個(gè)實(shí)施例對(duì)應(yīng)于二進(jìn)制XML格式的元素的框圖;圖3是根據(jù)本發(fā)明的一個(gè)實(shí)施例顯示整數(shù)的編碼格式的表;圖4a是根據(jù)本發(fā)明的一個(gè)實(shí)施例的特殊節(jié)點(diǎn)類型和標(biāo)識(shí)其相關(guān)聯(lián)的特殊節(jié)點(diǎn)的二進(jìn)制數(shù)據(jù)單元的對(duì)應(yīng)的字節(jié)值的表;圖4b是根據(jù)本發(fā)明的一個(gè)實(shí)施例的特殊節(jié)點(diǎn)類型和二進(jìn)制數(shù)據(jù)單元的對(duì)應(yīng)字節(jié)值的表;圖4c是描述圖4b中所示的一部分文本相關(guān)的特殊節(jié)點(diǎn)的一些特征的表;以及圖5是根據(jù)本發(fā)明的一個(gè)實(shí)施例用于處理XML文檔的方法的流程圖。
具體實(shí)施例方式
本發(fā)明在其應(yīng)用中不被限制于在以下描述中所闡述的、或在附圖中所示出的構(gòu)造的細(xì)節(jié)和組件的排列。本發(fā)明能夠有其它實(shí)施例,并能夠以各種方式實(shí)施或?qū)崿F(xiàn)。同樣,本文中所使用的措詞和術(shù)語(yǔ)是為描述的目的,而不應(yīng)被視為限制性的。本文中使用“包括”、“由……組成”、“具有”“包含”、“涉及”及其變體意味著包括其下所列出的項(xiàng)及其等價(jià)內(nèi)容以及附加項(xiàng)。
首先參考圖1來(lái)描述本發(fā)明的一個(gè)實(shí)施例的一些概括性的原理。圖1是根據(jù)本發(fā)明的一個(gè)實(shí)施例用于處理XML文檔的方法100的流程圖。方法100包括將信息與對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)單元相關(guān)聯(lián)(110),提供(120)XML文檔,以及通過(guò)使用信息項(xiàng)和對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)單元之間的關(guān)聯(lián),將XML文檔串行化(130)為二進(jìn)制XML格式,或?qū)ML文檔從二進(jìn)制XML格式反串行化(140)。
將XML文檔串行化(130)為二進(jìn)制XML格式包括將XML信息集的一個(gè)或多個(gè)信息項(xiàng)轉(zhuǎn)換成其對(duì)應(yīng)的一個(gè)或多個(gè)二進(jìn)制數(shù)據(jù)單元。類似地,將XML文檔從二進(jìn)制XML格式反串行化(140)包括將二進(jìn)制XML格式的一個(gè)或多個(gè)二進(jìn)制數(shù)據(jù)單元轉(zhuǎn)換成其對(duì)應(yīng)的一個(gè)或多個(gè)信息項(xiàng)。這些信息項(xiàng)可包括本領(lǐng)域普通技術(shù)人員所知的信息項(xiàng)的類型或任何其它適用的類型。如以下將更詳細(xì)描述,信息項(xiàng)和二進(jìn)制數(shù)據(jù)單元之間的關(guān)聯(lián)可提供對(duì)XML文檔更高效的處理和緊湊的串行化等等。
信息項(xiàng)可包括例如,原語(yǔ)類型、串、文本和XML構(gòu)造,以及在以下更詳細(xì)描述的其它適用信息。為方便起見(jiàn),信息項(xiàng)和對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)單元之間的關(guān)聯(lián)可被包括在一字典中。但是,對(duì)術(shù)語(yǔ)“字典”的使用并不被限制于任何特定的格式或存儲(chǔ)偏好。
字典在串行化期間可被用作參考,以支持將信息項(xiàng)轉(zhuǎn)換成對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)單元。一些適用的二進(jìn)制XML格式以及信息項(xiàng)和二進(jìn)制數(shù)據(jù)單元之間的關(guān)聯(lián)的字典將在以下更詳細(xì)地描述。
信息集及其信息項(xiàng)可符合由萬(wàn)維網(wǎng)聯(lián)盟(“W3C”)所建立的信息集的標(biāo)準(zhǔn),例如由http://www.w3.org/TR/2004/REC-xml-infoset-20040204所描述。構(gòu)造良好的XML文檔的信息集包含至少一個(gè)文檔信息項(xiàng)和若干個(gè)其它信息項(xiàng),其中信息項(xiàng)是XML文檔的某個(gè)部件的抽象描述。每個(gè)信息項(xiàng)都有一組相關(guān)聯(lián)的命名特性。
現(xiàn)在參考圖2到圖4,描述了二進(jìn)制XML格式的一些實(shí)施例。為方便起見(jiàn),二進(jìn)制數(shù)據(jù)單元的表示和二進(jìn)制數(shù)據(jù)單元本身被可互換地視為其相關(guān)聯(lián)的信息項(xiàng)的標(biāo)識(shí)符。但是可以理解,根據(jù)本發(fā)明的一個(gè)實(shí)施例,實(shí)際的串行化的二進(jìn)制XML文檔包括對(duì)應(yīng)于這些表示的二進(jìn)制數(shù)據(jù)單元的實(shí)際二進(jìn)制數(shù)。
此外,在此詳細(xì)描述中,在二進(jìn)制XML格式的一個(gè)實(shí)施例的組件起到和標(biāo)準(zhǔn)XML組件相似作用的地方通常使用標(biāo)準(zhǔn)XML命名約定。由此,XML領(lǐng)域普通技術(shù)人員將會(huì)認(rèn)識(shí)到諸如元素和屬性等組件的功能以及相關(guān)的值。
以下描述包括各種類型的信息項(xiàng)的字典條目的示例。這些示例可在本發(fā)明的實(shí)施例中使用,但僅僅旨在說(shuō)明,而不試圖將實(shí)施例局限于使用所示出的字典條目。本發(fā)明的一些實(shí)施例使用的關(guān)聯(lián)少于這里所有的關(guān)聯(lián),而其它實(shí)施例則包括額外的關(guān)聯(lián)。此外,分配給一些二進(jìn)制數(shù)據(jù)單元的具體值中至少有一些是任意的。
首先,為提供描述一些二進(jìn)制數(shù)據(jù)單元的上下文,參考圖2描述二進(jìn)制XML格式化的文檔的結(jié)構(gòu)的實(shí)施例。圖2是對(duì)應(yīng)于此說(shuō)明性實(shí)施例的二進(jìn)制格式的元素200的框圖。在此實(shí)施例中,文檔包括且僅包括一個(gè)元素200。但是該元素200可包含其它元素。
元素200包括開(kāi)始元素結(jié)構(gòu)220、一個(gè)或多個(gè)屬性結(jié)構(gòu)230、以及一個(gè)或多個(gè)元素內(nèi)容結(jié)構(gòu)240。元素200具有類似于標(biāo)準(zhǔn)XML元素的結(jié)構(gòu)。例如,對(duì)應(yīng)的XML元素可表現(xiàn)為“<ELEM...>...</ELEM>”。
元素200可用子集節(jié)點(diǎn)210開(kāi)始,并以結(jié)束元素節(jié)點(diǎn)250結(jié)束。如果不存在結(jié)束元素節(jié)點(diǎn)250,則元素200可用包括暗示元素200的結(jié)束的特殊文本節(jié)點(diǎn)的最后一個(gè)元素內(nèi)容結(jié)構(gòu)240結(jié)束。
元素200在以下更詳細(xì)地討論。接下來(lái)描述信息項(xiàng)和二進(jìn)制數(shù)據(jù)單元之間的、可用來(lái)串行化和反串行化元素200的內(nèi)容的關(guān)聯(lián)的一些示例。
串-本發(fā)明的一個(gè)實(shí)施例將串與對(duì)應(yīng)的串標(biāo)識(shí)符相關(guān)聯(lián),后者表現(xiàn)為串行化的文檔中的二進(jìn)制數(shù)據(jù)單元。串可被靜態(tài)地或動(dòng)態(tài)地放到字典中。靜態(tài)字典項(xiàng)是那些在XML文檔的串行化以前就定義好的項(xiàng)。在此情形中,串行化器和反串行化器可在需要靜態(tài)字典項(xiàng)以前就靜態(tài)字典項(xiàng)取得一致或被提供靜態(tài)字典項(xiàng)。
相反,動(dòng)態(tài)字典項(xiàng)是在串行化過(guò)程期間生成的。第一次碰到一個(gè)串時(shí),串行化器可例如向該串分配一標(biāo)識(shí)符號(hào),并將該串和相關(guān)聯(lián)的新串標(biāo)識(shí)符號(hào)一同放到串行化的文檔中。接收反串行化器隨即可將該新串和相關(guān)聯(lián)的標(biāo)識(shí)符號(hào)放到字典中以供稍后參考。從而同一個(gè)串的重復(fù)發(fā)生可通過(guò)僅使用標(biāo)識(shí)符的二進(jìn)制數(shù)據(jù)單元來(lái)串行化,即,無(wú)需包含該串。
作為此過(guò)程的一個(gè)示例,在串“Hello”的第一次使用之后,該串可在一行中出現(xiàn)四次,即“Hello”“Hello”“Hello”“Hello”。此序列可被轉(zhuǎn)換成“Hello=7,7,7,7”,其中新串“Hello”被動(dòng)態(tài)地分配標(biāo)識(shí)符號(hào)7。對(duì)于方法100,可用二進(jìn)制形式來(lái)表達(dá)標(biāo)識(shí)符號(hào)7以提供與串“Hello”相關(guān)聯(lián)的二進(jìn)制數(shù)據(jù)單元。
當(dāng)一個(gè)串被包括在串行化的文檔中時(shí),該串可通過(guò)使用標(biāo)準(zhǔn)XML或任何其它適用的格式來(lái)串行化。例如,串可被串行化為MB-32編碼的、指示該串的以字節(jié)為單位的長(zhǎng)度的整數(shù)(以下描述),之后是以UTF8編碼表示該串的字節(jié)數(shù)。UTF8是數(shù)據(jù)串行化領(lǐng)域普通技術(shù)人員所知的一種編碼標(biāo)準(zhǔn)。還可使用其它適用的編碼格式。字節(jié)數(shù)可以為零。
本發(fā)明的一個(gè)實(shí)施例對(duì)串標(biāo)識(shí)符有以下使用規(guī)則。如果未隨串標(biāo)識(shí)符包括實(shí)際的串,則該串必定在先前已被定義。例如,該串可能在較早時(shí)候已在文檔中定義,或已通過(guò)帶外機(jī)制定義。帶外機(jī)制包括例如,在文檔的串行化過(guò)程以外作出的預(yù)定義的靜態(tài)字典條目和動(dòng)態(tài)字典條目。
此外,至少到文檔的結(jié)束而不是僅當(dāng)前XML元素的結(jié)束為止,串的定義的范圍可被固定。串定義可被固定以防止其重新定義。串標(biāo)識(shí)符的二進(jìn)制數(shù)據(jù)單元的最后一位可指示該標(biāo)識(shí)符是否是從靜態(tài)字典導(dǎo)出的。此信息可被用來(lái)例如在文檔的串行化期間防止串在靜態(tài)字典中的重新定義。
原語(yǔ)類型-本發(fā)明的一些實(shí)施例使用原語(yǔ)類型的數(shù)據(jù)和標(biāo)識(shí)該數(shù)據(jù)的二進(jìn)制數(shù)據(jù)單元之間的關(guān)聯(lián)。如XML領(lǐng)域普通技術(shù)人員所知,原語(yǔ)類型(也稱為基本或簡(jiǎn)單類型)包括常數(shù)和可被表達(dá)為單值的其它數(shù)據(jù),包括例如數(shù)字和字符。本領(lǐng)域普通技術(shù)人員所知的原語(yǔ)類型的一些示例包括字符、8位有符號(hào)整數(shù)、有符號(hào)短整數(shù)、有符號(hào)整數(shù)、有符號(hào)長(zhǎng)整數(shù)、小數(shù)、實(shí)數(shù)(單精度)、實(shí)數(shù)(雙精度)、以及布爾類型。這些實(shí)施例將一個(gè)或多個(gè)原語(yǔ)類型與包括標(biāo)識(shí)該原語(yǔ)類型的一個(gè)字節(jié)和標(biāo)識(shí)該原語(yǔ)類型的值的二進(jìn)制表示的二進(jìn)制數(shù)據(jù)單元相關(guān)聯(lián)。以下參考圖4a描述本發(fā)明的一個(gè)實(shí)施例所用的一些原語(yǔ)類型及其相關(guān)聯(lián)的二進(jìn)制數(shù)據(jù)單元。
具有高效內(nèi)部表示的數(shù)據(jù)-在一些實(shí)施例中,具有高效內(nèi)部表示的數(shù)據(jù)與其內(nèi)部表示相關(guān)聯(lián)。即,這些數(shù)據(jù)被“轉(zhuǎn)換”成其本身。
例如,這些數(shù)據(jù)無(wú)需首先被編碼為文本來(lái)生成串。日期和時(shí)間是通常具有高效內(nèi)部表示的數(shù)據(jù)的示例。例如,日期“10/14/2004”可通過(guò)將十個(gè)字符‘1’、‘0’、‘/’、‘1’、‘4’、‘/’、‘2’、‘0’、‘0’和‘4’轉(zhuǎn)換成二進(jìn)制字節(jié)(例如,每個(gè)字符需要8或16位)來(lái)被串行化為二進(jìn)制格式。日期典型的內(nèi)部表示有64位;因此,出現(xiàn)在文檔中的這一日期可在存儲(chǔ)器中被串行化為其64位的表示,從而既節(jié)省了空間,又節(jié)省了處理時(shí)間。
現(xiàn)在參考圖3,在一些實(shí)施例中,數(shù)據(jù)的內(nèi)部表示的不需要的部分在相關(guān)聯(lián)的二進(jìn)制數(shù)據(jù)單元中被消除。例如,常規(guī)實(shí)施可能要求一個(gè)整數(shù)由4字節(jié)的數(shù)據(jù)來(lái)表示,即,要求4字節(jié)存儲(chǔ)器。但是,許多常用的整數(shù)是可裝進(jìn)一個(gè)或兩個(gè)字節(jié)中的很小的數(shù)。一個(gè)實(shí)施例經(jīng)由本文中稱為“MB32編碼”的一種編碼方案,將整數(shù)轉(zhuǎn)換成相關(guān)聯(lián)的二進(jìn)制數(shù)據(jù)單元。此編碼減少了提供相關(guān)聯(lián)整數(shù)的二進(jìn)制表示所需的空間。
圖3是示出整數(shù)的MB32編碼的一種實(shí)現(xiàn)所使用的空間的大小范圍表。如所示,未被使用的字節(jié)從串行化的整數(shù)中消除。其它適用的高效轉(zhuǎn)換對(duì)電子數(shù)據(jù)存儲(chǔ)領(lǐng)域普通技術(shù)人員將是顯而易見(jiàn)的。
如本領(lǐng)域普通技術(shù)人員所知,每個(gè)32位整數(shù)可具有從1到32個(gè)相關(guān)位。例如,十進(jìn)制數(shù)3,即二進(jìn)制數(shù)11,具有兩個(gè)相關(guān)位,而數(shù)54,即二進(jìn)制的110110,有6個(gè)相關(guān)位。在本發(fā)明的一個(gè)實(shí)施例中,MB32編碼方案僅對(duì)相關(guān)位編碼。此外,可將MB32整數(shù)的每個(gè)字節(jié)以最高位最先的方式編碼,而MB32整數(shù)的最低字節(jié)(LSB)可最先被存儲(chǔ)。
在一個(gè)實(shí)施例中,MB32整數(shù)的每個(gè)字節(jié)包含在需要時(shí)可用‘0’填充的七個(gè)相關(guān)位,并包含一個(gè)“繼續(xù)”位,即最高位。如果繼續(xù)位被設(shè)置,則有該MB32編碼的整數(shù)的另一個(gè)字節(jié)緊跟著當(dāng)前字節(jié)。MB32整數(shù)可被解碼為32位整數(shù),來(lái)自MB32字節(jié)的所有相關(guān)位可通過(guò)使用指示下一個(gè)字節(jié)應(yīng)被包括的繼續(xù)位來(lái)串接。
XML構(gòu)造-現(xiàn)在參考圖4a、4b和4c,在一些實(shí)施例中,一些二進(jìn)制數(shù)據(jù)單元標(biāo)識(shí)與XML構(gòu)造相關(guān)聯(lián)的信息項(xiàng)。由此,重復(fù)出現(xiàn)的XML構(gòu)造可經(jīng)由表示為簡(jiǎn)化操作(即,其相關(guān)聯(lián)的二進(jìn)制數(shù)據(jù)單元)來(lái)被更高效地串行化為二進(jìn)制格式。標(biāo)識(shí)構(gòu)造的二進(jìn)制數(shù)據(jù)單元在本文中稱為“特殊節(jié)點(diǎn)”。
圖4a是本發(fā)明的一個(gè)實(shí)施例所用的特殊節(jié)點(diǎn)類型和二進(jìn)制數(shù)據(jù)單元的對(duì)應(yīng)字節(jié)值的表。接下來(lái)描述特殊節(jié)點(diǎn)的示例。
前綴相關(guān)的構(gòu)造-XML包括與“前綴”相關(guān)聯(lián)的構(gòu)造。例如,元素<colorsblue>具有名字“blue”和前綴“colors”。為串行化此構(gòu)造和相關(guān)聯(lián)的信息,常規(guī)的串行化將包括帶有串“colors”和“blue”的前綴元素節(jié)點(diǎn)。
可使用一個(gè)字母的前綴來(lái)節(jié)省空間,諸如對(duì)本例而言的<cblue>等。但是,在本發(fā)明的一個(gè)實(shí)施例中,隨串“blue”將一快捷特殊節(jié)點(diǎn)(“用c加前綴的元素節(jié)點(diǎn)”)串行化,由此在串行化中消除了一個(gè)串,即串“colors”。一些實(shí)施例為從a到z的每個(gè)字母包括類似的特殊節(jié)點(diǎn)。接下來(lái)參考圖2給出對(duì)圖4a的表中所列的一些前綴相關(guān)的特殊節(jié)點(diǎn)的描述。
元素200的開(kāi)始元素結(jié)構(gòu)220與元素200的開(kāi)始相關(guān)聯(lián)。開(kāi)始元素結(jié)構(gòu)220可具有數(shù)種形式中的一種。這些形式可使用開(kāi)始元素相關(guān)的特殊節(jié)點(diǎn)。
這些特殊節(jié)點(diǎn)支持各種開(kāi)始元素相關(guān)的構(gòu)造的高效串行化。在此說(shuō)明性實(shí)施例中的這些構(gòu)造涉及前綴的存在、前綴的預(yù)定義(若有)、元素200的局部名、以及對(duì)應(yīng)于元素200的局部名的串的預(yù)定義(若有)。
例如,開(kāi)始元素結(jié)構(gòu)220可包括無(wú)前綴但有作為非預(yù)定義串的局部名(使用特殊節(jié)點(diǎn)“短元素”(ShortElement));有非預(yù)定義前綴和作為非預(yù)定義串的局部名(使用特殊節(jié)點(diǎn)“元素”(Element));無(wú)前綴但有作為預(yù)定義串的局部名(使用特殊節(jié)點(diǎn)“短字典元素”(ShortDictionaryElement)和標(biāo)識(shí)該串的二進(jìn)制數(shù)據(jù)單元);有預(yù)定義前綴和作為預(yù)定義串的局部名(使用特殊節(jié)點(diǎn)“前綴字典元素A”(PrefexDictionaryElementA)到“前綴字典元素Z”(PrefixDictionaryElementZ)中的一個(gè)和標(biāo)識(shí)該串的二進(jìn)制數(shù)據(jù)單元);或有非預(yù)定義前綴和作為預(yù)定義串的局部名(使用特殊節(jié)點(diǎn)“字典元素”(DictionaryElement));以及有預(yù)定義前綴和不是預(yù)定義串的局部名(使用特殊節(jié)點(diǎn)“前綴元素A”(PrefixElementA)到“前綴元素Z”(PrefixElementZ)中的一個(gè)和串)。
屬性相關(guān)的構(gòu)造-在XML中,元素“屬性”可被定義并被賦“值”。例如,文本XML代碼“<book author=smith>”將值“smith”賦予“book”元素的“author”屬性。為將此文檔以常規(guī)方式串行化,通常將隨串“author”和“smith”包括屬性賦值節(jié)點(diǎn)。在本發(fā)明的一個(gè)實(shí)施例中,為“author”屬性創(chuàng)建特殊節(jié)點(diǎn),例如來(lái)消除每對(duì)此屬性賦一次值就要將串“author”串行化的必要。
再次參考圖2,元素200的屬性結(jié)構(gòu)230對(duì)應(yīng)于XML屬性起作用。如同在標(biāo)準(zhǔn)XML中一樣,屬性結(jié)構(gòu)230可被用來(lái)例如將名字-值對(duì)與元素200相關(guān)聯(lián)。類似于以上就開(kāi)始元素相關(guān)的構(gòu)造所描述的示例,屬性相關(guān)的構(gòu)造可利用屬性相關(guān)的特殊節(jié)點(diǎn),諸如圖4a的表中所列的那些特殊節(jié)點(diǎn)等。
例如,為向“LocalName”屬性賦值“AttributeContent”,屬性結(jié)構(gòu)230可包括類似于以上就開(kāi)始元素220所描述的若干特殊節(jié)點(diǎn)中的一個(gè)。例如,圖4a的表提供了八個(gè)屬性有關(guān)的特殊節(jié)點(diǎn),其中四個(gè)是xmlns相關(guān)的,如以下將描述。另外四個(gè)屬性相關(guān)的特殊節(jié)點(diǎn)可在例如以下四種情況中使用該屬性無(wú)前綴且無(wú)預(yù)定義的串(短屬性,ShortAttribute),有非預(yù)定義的前綴但無(wú)預(yù)定義的串(屬性,Attribute),名字空間無(wú)前綴但有預(yù)定義的串(短字典屬性,ShortDictionaryAttribute),以及有非預(yù)定義的前綴和預(yù)定義的串(字典屬性,DictionaryAttribute)。
XML中常出現(xiàn)的一個(gè)屬性相關(guān)的構(gòu)造是賦“xmlns”(即名字空間屬性)值的構(gòu)造。在文本XML中,這可能表現(xiàn)為例如“<book xmlns=http://books.org>”,以將名字空間值“http://books.org”賦給元素“book”的“xmlns”屬性。常規(guī)上,在此例中,為發(fā)送此構(gòu)造和相關(guān)聯(lián)的值,“屬性賦值節(jié)點(diǎn)”后通常同時(shí)跟著串“xmlns”和“http://books.org”。
但是,如圖4a中所示,名字空間屬性構(gòu)造可由一個(gè)或多個(gè)快捷名字空間賦值特殊節(jié)點(diǎn)來(lái)表示。當(dāng)這些特殊節(jié)點(diǎn)中的一個(gè)和串“http://books.org”被包括在串行化的文檔中時(shí),其中一個(gè)串,即“Xmlns”不再需要被包括。即,二進(jìn)制格式串行化包括與該因特網(wǎng)地址相關(guān)聯(lián)的特殊節(jié)點(diǎn)和串。
為向名字空間屬性賦“xmlns”值,屬性結(jié)構(gòu)230可包括例如圖4a的表中所示的四個(gè)名字空間賦值特殊節(jié)點(diǎn)中的一個(gè)。這四個(gè)快捷xmlns相關(guān)的特殊節(jié)點(diǎn)可在以下情況中使用名字空間無(wú)前綴且無(wú)預(yù)定義的串(短Xmlns屬性(ShortXmlnsAttribute)),有非預(yù)定義的前綴但無(wú)預(yù)定義的串(Xmlns屬性(XmlnsAttribute)),無(wú)前綴但有預(yù)定義的串(短字典Xmlns屬性(ShortDictionaryXmlnsAttribute)),以及有非預(yù)定義的前綴和預(yù)定義的串(字典Xmlns屬性(DictionaryXmlnsAttribute))。
文本相關(guān)的構(gòu)造-圖4b是本發(fā)明的一個(gè)實(shí)施例所用的與文本相關(guān)信息項(xiàng)(包括上述的一些原語(yǔ)類型)的特殊節(jié)點(diǎn)類型和二進(jìn)制數(shù)據(jù)單元的對(duì)應(yīng)的字節(jié)值的表。該表包括以下原語(yǔ)類型的關(guān)聯(lián)布爾、數(shù)字(若干種變體)、列表、字符、文本、和二進(jìn)制數(shù)據(jù)。
圖4b的文本相關(guān)的特殊節(jié)點(diǎn)是成對(duì)提供的,包括特殊的結(jié)束元素節(jié)點(diǎn),這將在以下更詳細(xì)地描述。文本可用根據(jù)文本類型的方式來(lái)處理。例如,一個(gè)實(shí)施例為包括以下類型的文本提供關(guān)聯(lián)空串、預(yù)定義的串、任意串或數(shù)據(jù)、以及諸如日期/時(shí)間相關(guān)的串等特定類型的串。
可令空串與由字節(jié)值為147的二進(jìn)制數(shù)據(jù)單元所標(biāo)識(shí)的特殊節(jié)點(diǎn)“空文本”(EmptyText)相關(guān)聯(lián),如圖4b的示例中所示。字典中的串可由“字典文本”(DictionaryText)特殊節(jié)點(diǎn)(字節(jié)值為148)接著一標(biāo)識(shí)字典中的相關(guān)聯(lián)的串的MB32編碼的整數(shù)(此處是二進(jìn)制數(shù)據(jù)單元)來(lái)指示。
“字符...文本”(Chars...Text)和“字節(jié)...文本”(Bytes...Text)特殊節(jié)點(diǎn)支持任意串和數(shù)據(jù)。“字符...文本”特殊節(jié)點(diǎn)放在可經(jīng)由例如UTF8編碼來(lái)編碼的字母數(shù)字字符之前。“字節(jié)...文本”特殊節(jié)點(diǎn)放在二進(jìn)制數(shù)據(jù)之前。
這些特殊節(jié)點(diǎn)包括以下節(jié)點(diǎn)“8字符文本”(Chars8Text)或“8字節(jié)文本”(Bytes8Text),當(dāng)在串行化的二進(jìn)制格式文檔中包括這些節(jié)點(diǎn)時(shí),接著是一表示后跟的字節(jié)數(shù)的無(wú)符號(hào)字節(jié),再接著是與文本或數(shù)據(jù)相關(guān)聯(lián)的字節(jié);“16字符文本”(Chars16Text)或“16字節(jié)文本”(Bytes16Text),接著是表示后跟的字節(jié)數(shù)的2個(gè)字節(jié)(無(wú)符號(hào)LSB最先存儲(chǔ)),再接著是實(shí)際的字節(jié);以及“32字符文本”(Chars32Text)或“32字節(jié)文本”(Bytes32Text),接著是表示后跟的字節(jié)數(shù)的4個(gè)字節(jié)(有符號(hào),LSB最先存儲(chǔ),不允許負(fù)值),再接著是實(shí)際的字節(jié)?!白止?jié)...文本”特殊節(jié)點(diǎn)后面可跟著二進(jìn)制數(shù)據(jù)的字節(jié)表示,而無(wú)需編碼。
此實(shí)施例包括常出現(xiàn)的數(shù)值所用的快捷特殊節(jié)點(diǎn),以更高效地串行化相關(guān)聯(lián)的數(shù)值。例如,常規(guī)上,通常隨數(shù)字0使用一“整數(shù)節(jié)點(diǎn)”來(lái)串行化數(shù)字0。但是,現(xiàn)在所描述的說(shuō)明性實(shí)施例使用特殊節(jié)點(diǎn)“零文本”(ZeroText)(有二進(jìn)制數(shù)據(jù)單元字節(jié)值128)來(lái)串行化值0,如圖4b的表中所示。字符“0”和數(shù)字“0”可由同一特殊節(jié)點(diǎn)表示,因?yàn)樗鼈冊(cè)赬ML文檔中通常具有相同含義,因此可被可互換地使用。
圖4c是描述圖4b中所示的一部分文本相關(guān)的特殊節(jié)點(diǎn)的一些特征的表。這些節(jié)點(diǎn)包括諸如上述的“0”文本、以及“真”和“假”、整數(shù)、浮點(diǎn)、十進(jìn)制串、日期和時(shí)間、和列表等特定文本串的特殊節(jié)點(diǎn)。
如以上所提及,圖4b的文本相關(guān)的特殊節(jié)點(diǎn)包括相關(guān)聯(lián)的“...文本帶結(jié)束元素”(TextWithEndElement)節(jié)點(diǎn)。這些節(jié)點(diǎn)每一個(gè)都具有對(duì)應(yīng)于其相關(guān)聯(lián)的特殊節(jié)點(diǎn)的形式,例如“字典文本帶結(jié)束元素”(DictionaryTextWithEndElement)和“16位整數(shù)文本帶結(jié)束元素”(Int16TextWithEndElement)。
再次參考圖2,這些結(jié)構(gòu)可在元素200內(nèi)的最后一個(gè)元素內(nèi)容結(jié)構(gòu)240中使用?!?..帶結(jié)束元素”(WithEndElement)特殊節(jié)點(diǎn)可被用來(lái)指示其為代替結(jié)束元素節(jié)點(diǎn)250的最后一個(gè)元素內(nèi)容結(jié)構(gòu)240。例如,以下兩種形式都串行化<foo>3</foo>短元素特殊節(jié)點(diǎn),串(“foo”),8位整數(shù)文本特殊節(jié)點(diǎn),字節(jié)(3),結(jié)束元素特殊節(jié)點(diǎn),短元素特殊節(jié)點(diǎn),串(“foo”),8位整數(shù)文本帶結(jié)束元素特殊節(jié)點(diǎn),字節(jié)(3)。由此,當(dāng)“...帶結(jié)束元素”特殊節(jié)點(diǎn)被用來(lái)代替相關(guān)聯(lián)的“...文本”特殊節(jié)點(diǎn)時(shí),無(wú)需使用結(jié)束元素節(jié)點(diǎn)250。
考慮到本文中所提供的對(duì)特殊節(jié)點(diǎn)的描述,對(duì)XML領(lǐng)域普通技術(shù)人員而言,可供用作二進(jìn)制數(shù)據(jù)單元的許多其它特殊節(jié)點(diǎn)將是顯而易見(jiàn)的。
如果元素200包括多個(gè)元素內(nèi)容結(jié)構(gòu)240,則結(jié)構(gòu)240可被串接以進(jìn)一步提高串行化的效率。例如,如果以下四種示例性元素內(nèi)容結(jié)構(gòu)240被包括在元素200中,1字符文本“ABC”2元素“FOO”3字符文本“X”4字符文本“YZ”則它們可被串接以表現(xiàn)為“<ELEM>ABC<FOO/>XYZ</ELEM>”。
圖4b中的至少一部分文本相關(guān)的特殊節(jié)點(diǎn)可使用串接。例如,8字符文本(“A”)后接8字符文本(“BC”)在被讀為串時(shí),可被串接為“ABC”。在一些實(shí)施例中,不將諸如日期/時(shí)間串和零值串等特定的串類型與相鄰節(jié)點(diǎn)串接。例如,當(dāng)試圖讀取整數(shù)時(shí),8位整數(shù)文本(23)后接8字符文本(“0”)將不會(huì)被反串行化為數(shù)字230。
在一些實(shí)施例中,相繼的列表也不被串接,以保留它們單獨(dú)的身份。例如,當(dāng)試圖讀入整數(shù)數(shù)組時(shí),列表(1,2)和列表(3,4)將不會(huì)被反串行化為{1,2,3,4}。
在本發(fā)明的一個(gè)實(shí)施例中,元素內(nèi)容結(jié)構(gòu)240具有三種形式中的一種。元素內(nèi)容結(jié)構(gòu)240本身可以是一個(gè)元素(嵌入在元素200內(nèi)),可包括文本或其它數(shù)據(jù),以及可以是包括對(duì)應(yīng)于注釋的串的注釋節(jié)點(diǎn)。
現(xiàn)在回到首先在背景技術(shù)一節(jié)中所描述的示例性XML文檔,本發(fā)明的二進(jìn)制XML格式的一個(gè)實(shí)施例將此示例性文檔串行化如下第一字節(jié)0(對(duì)于“簡(jiǎn)單元素的開(kāi)始”特殊節(jié)點(diǎn)的二進(jìn)制數(shù)據(jù)單元)第二字節(jié)4(要為該元素名字串行化的串的長(zhǎng)度)第三/第四/第五/第六字節(jié)66,111,111,107(用UTF8編碼的‘B’、‘o’、‘o’、‘k’)第七字節(jié)5(對(duì)于“簡(jiǎn)單屬性的開(kāi)始”特殊節(jié)點(diǎn)的二進(jìn)制數(shù)據(jù)單元)第八字節(jié)5(要為該屬性名字發(fā)送的串的長(zhǎng)度)第九-第十三字節(jié)‘P’、‘r’、‘i’、‘c’、‘e’(用UTF8編碼)
第十四字節(jié)131(對(duì)于“小整數(shù)文本”特殊節(jié)點(diǎn)的二進(jìn)制數(shù)據(jù)單元)第十五字節(jié)35(整數(shù)屬性的值,它無(wú)需被編碼為字符‘3’和‘5’)等等……方便的是,在一些實(shí)施例中,控制信息集的串行化的面向?qū)ο蟮拇a具有遵循和文本串行化的常規(guī)方法調(diào)用相同的模式的方法調(diào)用。由此,方法100可提供XML文檔的直接二進(jìn)制串行化,而不要求程序員知悉由對(duì)二進(jìn)制串行化器和/或二進(jìn)制反串行化器的調(diào)用所調(diào)用的處理。例如,一組對(duì)“二進(jìn)制XML寫入器”的函數(shù)調(diào)用將表現(xiàn)為BinaryXmlWriter.WriteStartElement(“Book”);BinaryXmlWriter.WriteAttribute(“Price”,someDatabase.LookUpPriceForBook(“WarAndPeace”));BinaryXmlWriter.WriteElementContents(“War and Peace”);BinaryXmlWriter.WriteEndElement();盡管這看起來(lái)和在以上背景技術(shù)部分中所描述的相似,但是“二進(jìn)制XML寫入器”實(shí)現(xiàn)方法100以產(chǎn)生如上所述的二進(jìn)制格式化的XML。
本發(fā)明不局限于特定協(xié)議和/或格式??捎脕?lái)實(shí)現(xiàn)本發(fā)明的原理的一種示例性協(xié)議是SOAP。
子集-在本發(fā)明的一些實(shí)施例中,子集是串行化的文檔的一部分。子集是由例如文檔中所包含的一個(gè)或多個(gè)標(biāo)記標(biāo)識(shí)的。特別地,子集是自包含的。即,子集不引用該子集外部的內(nèi)容來(lái)實(shí)現(xiàn)該子集的反串行化。
根據(jù)本發(fā)明的一個(gè)實(shí)施例,可任選的子集節(jié)點(diǎn)210(若有)指示元素200及其內(nèi)容(包括所包含的元素(若有)的完整的樹(shù))是一子集。在與圖4a的表相關(guān)聯(lián)的說(shuō)明性實(shí)施例中,子集節(jié)點(diǎn)由字節(jié)值為15的二進(jìn)制數(shù)據(jù)單元所標(biāo)識(shí)。子集節(jié)點(diǎn)也被稱為“標(biāo)簽”或“標(biāo)記”。
在一些實(shí)施例中,子集由開(kāi)始標(biāo)簽和結(jié)束標(biāo)簽來(lái)劃界。一些實(shí)施例不使用結(jié)束標(biāo)簽。例如,一個(gè)使用字節(jié)節(jié)點(diǎn)210作為開(kāi)始元素結(jié)構(gòu)220的前綴的實(shí)施例無(wú)需任何特殊節(jié)點(diǎn)來(lái)指示子集的結(jié)束。在此實(shí)施例中,元素的結(jié)束即指示對(duì)應(yīng)于該元素的子集的結(jié)束。
根據(jù)本發(fā)明的一個(gè)實(shí)施例,子集是XML文檔中可獨(dú)立于該文檔的其它部分來(lái)處理而不會(huì)丟失該子集所持有的任何意義的一個(gè)部件。子集不引用該子集外部的內(nèi)容。
子集可通過(guò)提供一種用于生成和保護(hù)文檔中獨(dú)立于包括可能在范圍內(nèi)的任何字典的當(dāng)前范圍的一個(gè)部分的機(jī)制,來(lái)提供一種有效的數(shù)字簽名和驗(yàn)證機(jī)制。特別地,要被簽署或驗(yàn)證的字節(jié)可串行地存在存儲(chǔ)器中,從而它們可被轉(zhuǎn)發(fā)給例如對(duì)當(dāng)前串行化/反串行化范圍一無(wú)所知的消耗器。
在一個(gè)實(shí)施例中,XML子集在串行化文檔中由兩個(gè)標(biāo)記表示——一個(gè)標(biāo)記子集的開(kāi)始,一個(gè)標(biāo)記結(jié)束。這允許例如在遇到子集時(shí)讀出器/寫入器重置當(dāng)前字典,以確保對(duì)子集的處理對(duì)現(xiàn)有范圍沒(méi)有依賴關(guān)系。一旦結(jié)束標(biāo)記被定位,先前的字典狀態(tài)即可被恢復(fù)。此實(shí)施例允許反串行化二進(jìn)制XML格式的讀出器選擇給出應(yīng)用程序編程接口(API),該API在消耗器從不請(qǐng)求子集的情況下,以二進(jìn)制XML格式維持該子集的存在對(duì)文檔的消耗器不可見(jiàn)的狀態(tài)。
子集可被視為包含該子集的文檔的特殊部分。在本發(fā)明的一些實(shí)施例中,當(dāng)諸如子集節(jié)點(diǎn)等子集邊界被越過(guò)時(shí),特殊處理被調(diào)用。在這些實(shí)施例的一部分中,該特殊處理是二進(jìn)制串行化的文檔的讀出器所負(fù)責(zé)的。
如上所述,接收包含一個(gè)或多個(gè)子集的二進(jìn)制格式化的文檔的用戶無(wú)需知悉這一個(gè)或多個(gè)子集的存在。由此,可帶或不帶子集地將文檔串行化,然后將其反串行化以給出相同的原始文檔。即,使用子集不改變?cè)嫉腦ML文檔。只有消耗二進(jìn)制格式化的數(shù)據(jù)的讀出器或其它實(shí)體才需要認(rèn)識(shí)到任何子集的存在。
類似地,如果串行化的文檔包含子集,則讀出器(例如,反串行化器)可揭示何處存在子集化。由此,例如,讀出器可將所接收的二進(jìn)制格式化的文檔轉(zhuǎn)換成原始的XML文檔,以供由例如軟件程序等處理;然后讀出器還可向該軟件程序指示該XML文檔中被子集化的部分。
子集可具有以下有利用途中的一種或數(shù)種。子集可從一個(gè)XML文檔中被“切掉”并被發(fā)送到另一個(gè)系統(tǒng)。接收系統(tǒng)可確保子集的可靠性,因?yàn)樽x取該子集所需的所有信息都被封裝在該子集內(nèi)。
如果子集被數(shù)字地簽署,則可確保無(wú)人可通過(guò)改變?cè)撟蛹馇椅幢缓炇鸬捻?xiàng)來(lái)篡改該子集的含義。同樣,這是因?yàn)榭杀WC子集不引用其外部的任何數(shù)據(jù)。子集可被嵌套,并可支持以上關(guān)于方法100所描述的特征。
串行化器和反串行化器在遇到子集時(shí)可執(zhí)行特殊功能。例如,在一個(gè)實(shí)施例中,當(dāng)串行化子集時(shí),串行化器不在該子集外發(fā)出字典標(biāo)識(shí)符。同樣,在一個(gè)實(shí)施例中,當(dāng)在子集的串行化期間發(fā)出新串時(shí),串行化器不向字典添加該子集外部的內(nèi)容。此外,在離開(kāi)子集時(shí),串行化器可恢復(fù)外部字典。在一個(gè)實(shí)施例中,串行化器為嵌套子集維護(hù)字典棧。反串行化器可執(zhí)行對(duì)應(yīng)于串行化器的功能的功能。
在一個(gè)實(shí)施例中,子集或者不使用父元素中所定義的任何名字空間前綴,或者在使用以前重新定義名字空間前綴。子集無(wú)需使用影響XML文檔的處理的任何標(biāo)準(zhǔn)XML屬性。例如,在一個(gè)實(shí)施例中,XML領(lǐng)域普通技術(shù)人員所知的xmllang和xmlspace屬性和為屬性所使用的限定名被重新發(fā)出。在此實(shí)施例中,元素內(nèi)容結(jié)構(gòu)240中所使用的任何限定名或者不使用父元素中所定義的任何名字空間前綴,或者在使用以前重新定義名字空間前綴。
由此,在一個(gè)實(shí)施例中,串行化器重新發(fā)出在子集以外所定義的該串行化器所知的所有可能影響子集中的數(shù)據(jù)的信息。這可包括,但不限于,名字空間前綴聲明和如xmllang及xmlspace等標(biāo)準(zhǔn)XML屬性。
在一個(gè)實(shí)施例中,反串行化器一進(jìn)入子集,即忘記在該子集以外所定義的該反串行化器所知的所有可能影響該子集中的數(shù)據(jù)的信息。這可包括,但不限于,嵌套子集的名字空間前綴聲明和如xmllang及xmlspace等標(biāo)準(zhǔn)XML屬性。反串行化器一離開(kāi)子集,即可記起在該子集以外所定義的該反串行化器所知的所有可能影響該子集中的數(shù)據(jù)的信息。反串行化器可維護(hù)在該子集以外所定義的該反串行化器所知的所有可能影響該子集中的數(shù)據(jù)的信息棧。
當(dāng)遇到子集時(shí),任何或所有當(dāng)前所定義的字典標(biāo)識(shí)符,包括那些帶外定義的,可被放在一邊。當(dāng)離開(kāi)子集時(shí),在子集內(nèi)部所定義的字典項(xiàng)可被忘記,而先前的字典項(xiàng)可被恢復(fù)。
現(xiàn)在參考圖5,將描述一種利用子集來(lái)串行化文檔的方法的示例。圖5是根據(jù)本發(fā)明的一個(gè)實(shí)施例用于處理XML文檔的方法500的流程圖。方法500包括提供(520)與包括一個(gè)或多個(gè)信息項(xiàng)的XML信息集相關(guān)聯(lián)的XML文檔,以及將該XML文檔串行化(530)為串行化的格式。串行化的格式包括至少一個(gè)含子集節(jié)點(diǎn)的子集元素。子集節(jié)點(diǎn)指示該至少一個(gè)子集元素可獨(dú)立于該XML文檔的其余部分來(lái)反串行化。
類似于方法100,方法500可包括將信息項(xiàng)與對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)單元相關(guān)聯(lián)(510),并可包括通過(guò)使用信息項(xiàng)和對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)單元之間的關(guān)聯(lián)將XML文檔從串行化的格式反串行化(540)。
諸如上述子集元素等子集可包括反串行化該子集元素所需的所有內(nèi)容。子集元素可獨(dú)立于XML文檔的其余部分來(lái)反串行化,和/或被提取(550),并可不帶該文檔的其余部分而被發(fā)送。此外,在一些實(shí)現(xiàn)中,子集元素的范圍獨(dú)立于包含該子集元素的XML文檔的范圍。子集元素還可具有如上所述的子集的其它特征。
本發(fā)明范圍內(nèi)的實(shí)施例包括用于攜帶或其上存儲(chǔ)有計(jì)算機(jī)可執(zhí)行指令或數(shù)據(jù)結(jié)構(gòu)的計(jì)算機(jī)可讀介質(zhì)。這些計(jì)算機(jī)可讀介質(zhì)可以是可由通用或?qū)S糜?jì)算機(jī)訪問(wèn)的任何可用介質(zhì)。作為示例,而非限制,這些計(jì)算機(jī)可讀介質(zhì)可包括物理計(jì)算機(jī)可讀介質(zhì),諸如RAM、ROM、EEPROM、CD-ROM或其它光盤存儲(chǔ)、磁盤存儲(chǔ)或其它磁存儲(chǔ)設(shè)備、或可用來(lái)攜帶或存儲(chǔ)計(jì)算機(jī)可執(zhí)行指令或數(shù)據(jù)結(jié)構(gòu)的形式的所需程序代碼并可由通用或?qū)S糜?jì)算機(jī)訪問(wèn)的任何其它介質(zhì)等。
當(dāng)通過(guò)網(wǎng)絡(luò)或其它通信連接(無(wú)論是有線的、無(wú)線的,還是有線或無(wú)線的組合)向計(jì)算機(jī)傳輸或提供信息時(shí),計(jì)算機(jī)可將該連接視為計(jì)算機(jī)可讀介質(zhì)。由此,任何此類連接可被稱為計(jì)算機(jī)可讀介質(zhì)。以上的組合也應(yīng)被包括在計(jì)算機(jī)可讀介質(zhì)的范圍之內(nèi)。計(jì)算機(jī)可執(zhí)行指令包括例如,使通用計(jì)算機(jī)、專用計(jì)算機(jī)、或?qū)S锰幚碓O(shè)備執(zhí)行某個(gè)或某組功能的任何指令和數(shù)據(jù)。計(jì)算機(jī)可執(zhí)行指令可以是例如,二進(jìn)制代碼、諸如匯編語(yǔ)言等中間格式的指令、或甚至是源代碼。
本領(lǐng)域技術(shù)人員將會(huì)認(rèn)識(shí)到,本發(fā)明可用許多類型的計(jì)算機(jī)系統(tǒng)配置在網(wǎng)絡(luò)計(jì)算環(huán)境中實(shí)施,這些配置包括個(gè)人計(jì)算機(jī)、手持式設(shè)備、多處理器系統(tǒng)、基于微處理器的或可編程的消費(fèi)者電子設(shè)備、網(wǎng)絡(luò)PC、小型計(jì)算機(jī)、大型計(jì)算機(jī)、等等。本發(fā)明還可在分布式計(jì)算環(huán)境中實(shí)施,其中任務(wù)是由通過(guò)通信網(wǎng)絡(luò)連接(無(wú)論是有線連接、無(wú)線連接、還是有線或無(wú)線連接的組合)的本地和遠(yuǎn)程處理設(shè)備執(zhí)行的。在分布式計(jì)算環(huán)境中,程序模塊既可位于本地記憶存儲(chǔ)設(shè)備中,也可位于遠(yuǎn)程記憶存儲(chǔ)設(shè)備中。
計(jì)算機(jī)可使用到一個(gè)或多個(gè)遠(yuǎn)程計(jì)算機(jī)的邏輯連接在聯(lián)網(wǎng)環(huán)境中工作。遠(yuǎn)程計(jì)算機(jī)每一個(gè)都可以是另一個(gè)人計(jì)算機(jī)、服務(wù)器、路由器、網(wǎng)絡(luò)PC、對(duì)等設(shè)備或其它常見(jiàn)的網(wǎng)絡(luò)節(jié)點(diǎn),并通常包括許多或所有上述元件。邏輯連接可包括例如局域網(wǎng)(LAN)和廣域網(wǎng)(WAN),在本文中給出這兩者是作為示例而非限制。這些網(wǎng)絡(luò)環(huán)境常見(jiàn)于辦公室范圍或企業(yè)范圍的計(jì)算機(jī)網(wǎng)絡(luò)、內(nèi)聯(lián)網(wǎng)和因特網(wǎng)。
計(jì)算系統(tǒng)可被寬泛地定義為能夠使用軟件來(lái)執(zhí)行一個(gè)或多個(gè)功能的任意一個(gè)或多個(gè)硬件組件。計(jì)算系統(tǒng)的示例包括臺(tái)式計(jì)算機(jī)、膝上計(jì)算機(jī)、個(gè)人數(shù)字助理(PDA)、電話、或具有處理能力的任何其它系統(tǒng)或設(shè)備。
本發(fā)明的一些實(shí)施例將文檔串行化為SOAP信封。如公知的,SOAP信封可通過(guò)許多傳輸協(xié)議來(lái)發(fā)送,諸如超文本傳輸協(xié)議(HTTP)、安全HTTP(HTTPS)、簡(jiǎn)單郵件傳輸協(xié)議(SMTP)、用戶數(shù)據(jù)報(bào)協(xié)議(UDP)、傳輸控制協(xié)議(TCP)、藍(lán)牙、等等。
由此以上描述了本發(fā)明的至少一個(gè)實(shí)施例的數(shù)個(gè)方面,應(yīng)當(dāng)認(rèn)識(shí)到,對(duì)本領(lǐng)域技術(shù)人員而言,各種替換、修改和改進(jìn)將是很容易的。本文旨在令此類替換、修改和改進(jìn)成為本發(fā)明的一部分,并旨在使它們落入本發(fā)明的精神和范圍之內(nèi)。由此,以上描述和附圖都只是示例性的。
權(quán)利要求
1.一種用于在基于計(jì)算機(jī)的系統(tǒng)中處理可擴(kuò)展標(biāo)記語(yǔ)言(XML)文檔的方法,所述方法包括將多個(gè)信息項(xiàng)中的每一個(gè)與多個(gè)二進(jìn)制數(shù)據(jù)單元中的對(duì)應(yīng)的一個(gè)相關(guān)聯(lián);提供與包括所述多個(gè)信息項(xiàng)中的一個(gè)或多個(gè)的XML信息集相關(guān)聯(lián)的XML文檔;以及將所述XML文檔串行化為二進(jìn)制XML格式,其中,串行化包括將所述XML信息集的一個(gè)或多個(gè)信息項(xiàng)轉(zhuǎn)換成其所對(duì)應(yīng)的一個(gè)或多個(gè)二進(jìn)制數(shù)據(jù)單元,或者將所述XML文檔從所述二進(jìn)制XML格式反串行化,其中,反串行化包括將所述二進(jìn)制XML格式的一個(gè)或多個(gè)二進(jìn)制數(shù)據(jù)單元轉(zhuǎn)換成其所對(duì)應(yīng)的一個(gè)或多個(gè)信息項(xiàng)。
2.如權(quán)利要求1所述的方法,其特征在于,所述串行化包括在無(wú)需首先將所述一個(gè)或多個(gè)信息項(xiàng)轉(zhuǎn)換成文本的XML格式的情況下,將所述一個(gè)或多個(gè)信息項(xiàng)轉(zhuǎn)換成其所對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)單元。
3.如權(quán)利要求1所述的方法,其特征在于,所述反串行化包括在無(wú)需首先將所述一個(gè)或多個(gè)二進(jìn)制數(shù)據(jù)單元轉(zhuǎn)換成文本的XML格式的情況下,將所述二進(jìn)制XML格式的一個(gè)或多個(gè)二進(jìn)制數(shù)據(jù)單元轉(zhuǎn)換成其所對(duì)應(yīng)的信息項(xiàng)。
4.如權(quán)利要求1所述的方法,其特征在于,所述串行化是在無(wú)需知道所述XML文檔的一個(gè)或多個(gè)信息項(xiàng)中正在被串行化的當(dāng)前信息項(xiàng)以后的任何一個(gè)信息項(xiàng)的內(nèi)容的情況下執(zhí)行的。
5.如權(quán)利要求4所述的方法,其特征在于,所述串行化是在無(wú)需首先至少收集與所述XML文檔相關(guān)聯(lián)信息項(xiàng)中的大多數(shù)的情況下執(zhí)行的。
6.如權(quán)利要求1所述的方法,其特征在于,所述串行化包括按照與將所述一個(gè)或多個(gè)信息項(xiàng)轉(zhuǎn)換成文本的XML格式相關(guān)聯(lián)的順序?qū)?yīng)的順序來(lái)轉(zhuǎn)換所述一個(gè)或多個(gè)信息項(xiàng)。
7.如權(quán)利要求1所述的方法,其特征在于,所述一個(gè)或多個(gè)信息項(xiàng)中的至少一個(gè)具有二進(jìn)制存儲(chǔ)格式,且所述關(guān)聯(lián)包括將所述一個(gè)或多個(gè)信息項(xiàng)中的至少一個(gè)與其二進(jìn)制存儲(chǔ)格式相關(guān)聯(lián)。
8.如權(quán)利要求1所述的方法,其特征在于,所述一個(gè)或多個(gè)信息項(xiàng)中的至少一個(gè)是從包含數(shù)字、字符、時(shí)間和日期的一組項(xiàng)中選擇的。
9.如權(quán)利要求1所述的方法,其特征在于,所述一個(gè)或多個(gè)信息項(xiàng)包括一個(gè)或多個(gè)串,所述關(guān)聯(lián)包括將所述一個(gè)或多個(gè)串的每一個(gè)與一個(gè)或多個(gè)串標(biāo)識(shí)符中的對(duì)應(yīng)的一個(gè)相關(guān)聯(lián),所述串行化包括將所述一個(gè)或多個(gè)串轉(zhuǎn)換成其所對(duì)應(yīng)的串標(biāo)識(shí)符,且所述反串行化包括將所述一個(gè)或多個(gè)串標(biāo)識(shí)符轉(zhuǎn)換成其所對(duì)應(yīng)的一個(gè)或多個(gè)串。
10.如權(quán)利要求9所述的方法,其特征在于,所述一個(gè)或多個(gè)串標(biāo)識(shí)符中的每一個(gè)都與一個(gè)數(shù)字相關(guān)聯(lián)。
11.如權(quán)利要求9所述的方法,其特征在于,還包括在串行化以前,向串行化單元和反串行化單元提供關(guān)于所述一個(gè)或多個(gè)串中的至少一部分與其所對(duì)應(yīng)的一個(gè)或多個(gè)串標(biāo)識(shí)符之間的關(guān)聯(lián)的信息。
12.如權(quán)利要求9所述的方法,其特征在于,還包括在串行化期間,向串行化單元和反串行化單元提供關(guān)于所述一個(gè)或多個(gè)串中的至少一部分與其所對(duì)應(yīng)的一個(gè)或多個(gè)串標(biāo)識(shí)符之間的關(guān)聯(lián)的信息。
13.如權(quán)利要求9所述的方法,其特征在于,所述關(guān)聯(lián)包括在串行化所述XML文檔的同時(shí)定義所述一個(gè)或多個(gè)串中的一部分的關(guān)聯(lián),并且在所述串行化的XML文檔中同時(shí)包括所述一個(gè)或多個(gè)串中的一部分和其所對(duì)應(yīng)的一個(gè)或多個(gè)串標(biāo)識(shí)符兩者,以向反串行化單元通知所述部分的關(guān)聯(lián)。
14.如權(quán)利要求1所述的方法,其特征在于,所述一個(gè)或多個(gè)信息項(xiàng)包括一個(gè)或多個(gè)原語(yǔ)類型,且所述關(guān)聯(lián)包括將所述一個(gè)或多個(gè)原語(yǔ)類型中的每一個(gè)與對(duì)應(yīng)的類型標(biāo)識(shí)符和對(duì)應(yīng)的二進(jìn)制數(shù)相關(guān)聯(lián)。
15.如權(quán)利要求1所述的方法,其特征在于,所述一個(gè)或多個(gè)信息項(xiàng)包括一個(gè)或多個(gè)XML構(gòu)造。
16.如權(quán)利要求1所述的方法,其特征在于,還包括將所述二進(jìn)制XML格式從第一單元發(fā)送到第二單元,其中,所述第一單元和第二單元每一個(gè)都是從包括處理器、存儲(chǔ)設(shè)備、客戶計(jì)算機(jī)和服務(wù)器的一組單元類型中選擇的。
17.如權(quán)利要求16所述的方法,其特征在于,所述第一單元串行化所述XML文檔,且所述第二單元反串行化所述XML文檔。
18.如權(quán)利要求1所述的方法,其特征在于,所述二進(jìn)制格式的串行化的XML文檔和與所述XML文檔相關(guān)聯(lián)的文本XML文檔具有直接對(duì)應(yīng)關(guān)系。
19.如權(quán)利要求1所述的方法,其特征在于,所述XML文檔是SOAP信封。
20.一種用在至少一個(gè)處理器上執(zhí)行的程序編碼的計(jì)算機(jī)可讀介質(zhì),當(dāng)在所述至少一個(gè)處理器上執(zhí)行所述程序時(shí),執(zhí)行一種用于處理可擴(kuò)展標(biāo)記語(yǔ)言(XML)文檔的方法,所述方法包括將多個(gè)信息項(xiàng)中的每一個(gè)與多個(gè)二進(jìn)制數(shù)據(jù)單元中的對(duì)應(yīng)的一個(gè)相關(guān)聯(lián);提供與包括所述多個(gè)信息項(xiàng)中的一個(gè)或多個(gè)的XML信息集相關(guān)聯(lián)的XML文檔;以及將所述XML文檔串行化為二進(jìn)制XML格式,其中,串行化包括將所述XML信息集的一個(gè)或多個(gè)信息項(xiàng)轉(zhuǎn)換成其所對(duì)應(yīng)的一個(gè)或多個(gè)二進(jìn)制數(shù)據(jù)單元,或者將所述XML文檔從所述二進(jìn)制XML格式反串行化,其中,反串行化包括將所述二進(jìn)制XML格式的一個(gè)或多個(gè)二進(jìn)制數(shù)據(jù)單元轉(zhuǎn)換成其所對(duì)應(yīng)的一個(gè)或多個(gè)信息項(xiàng)。
全文摘要
一種用于在基于計(jì)算機(jī)的系統(tǒng)中處理XML文檔的方法包括將多個(gè)信息項(xiàng)中的每一個(gè)與多個(gè)二進(jìn)制數(shù)據(jù)單元中對(duì)應(yīng)的一個(gè)相關(guān)聯(lián),并提供與包括這多個(gè)信息項(xiàng)中的一個(gè)或多個(gè)的XML信息集相關(guān)聯(lián)的XML文檔。該方法包括將XML文檔串行化為二進(jìn)制XML格式,或?qū)ML文檔從二進(jìn)制XML格式反串行化。串行化包括將XML信息集的一個(gè)或多個(gè)信息項(xiàng)轉(zhuǎn)換成其所對(duì)應(yīng)的一個(gè)或多個(gè)二進(jìn)制數(shù)據(jù)單元。反串行化包括將二進(jìn)制XML格式的一個(gè)或多個(gè)二進(jìn)制數(shù)據(jù)單元轉(zhuǎn)換成其所對(duì)應(yīng)的一個(gè)或多個(gè)信息項(xiàng)。用在至少一個(gè)處理器上執(zhí)行的程序來(lái)編碼計(jì)算機(jī)可執(zhí)行介質(zhì)。當(dāng)在該至少一個(gè)處理器上執(zhí)行該程序時(shí),它可執(zhí)行該用于處理XML文檔的方法。
文檔編號(hào)H04L29/06GK1811753SQ200510003538
公開(kāi)日2006年8月2日 申請(qǐng)日期2005年12月23日 優(yōu)先權(quán)日2005年1月25日
發(fā)明者A·A·斯特恩, E·R·克里斯滕森, M·J·考爾森 申請(qǐng)人:微軟公司