专利名称:使用书签的流对象实例化的制作方法
使用书签的流对象实例化背景可以从流数据中创建对象实例。例如,对象实例化管理器可以访问各种类定义。流 数据提供驱动实例化管理器来实例化特定类的对象的指令。流数据还提供与如何实例化和 如何填充这些对象有关的指令。在直接从流数据进行实例化而不缓冲时,这些指令应当以 如下方式来编写在接收到这些指令时实例化管理器具有对每一指令作出响应所必需的所 有信息。或者,实例化管理器可以缓冲流数据,直至接收到所有指令。例如,如果实例化指 令是使用标记表示的,则缓冲所有标记文档。简要概述本文描述的各实施例涉及用书签来标记一组流权标中的权标,每一权标表示一实 例化指令。导航器接收一组流权标并将这些权标提供给实例化管理器。然而,如果实例化 管理器请求导航器用书签来标记特定权标,则导航器缓冲至少在用书签标记的权标处开始 (并且在存在先前书签的情况下甚至可能更早)的该组流指令。导航器响应于来自实例化 管理器的指令来重放在书签处开始的该组流权标。实例化管理器接收该组流权标。如果实例化管理器目前不能处理特定权标的指 令,则实例化管理器指示导航器用书签来标记该特定权标。在实例化管理器稍后接收到准 许该实例化管理器返回至该书签的权标时,该实例化管理器返回至书签以重放在该书签处 开始的实例化指令。这准许实例化管理器正确地遵循实例化指令的集合而不需要缓冲所有的实例化 指令。此外,实例化管理器可以处理实例化权标的流而不必能够在接收到每一权标时能够 对它进行处理。本概述不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于帮助 确定所要求保护的主题的范围。附图简述为了描述可获得本发明的上述和其他优点和特征的方式,本发明各实施例的更具 体描述在附图中示出。可以理解,这些附图仅描述本发明的各典型实施例,从而不被认为是 对其范围的限制,将通过使用附图用附加特征和细节来描述和解释这些实施例,附图中
图1示出可用于传送流数据的示例计算系统;图2示出其中使用流数据来在存储器中实例化对象的软件体系结构;图3示出供导航器便于响应于流权标来实例化对象的方法的流程图;图4示出使导航器用书签来标记权标的方法的流程图;以及图5示出可使导航器进入重放模式从而重放自先前书签处的权标流的方法的流 程图;以及图6示出供实例化管理器从导航器接收一组权标的方法的流程图。详细描述根据本文描述的各实施例,描述了用书签来标记一组流权标中的权标,其中每一 权标表示一实例化指令或至少提供实例化上下文。导航器接收一组流权标并将这些权标提供给实例化管理器。然而,如果请求导航器用书签来标记特定权标,则导航器缓冲至少在用 书签标记的权标处开始(并且在存在先前书签的情况下甚至可能更早)的该组流指令。导 航器响应于来自实例化管理器的指令来重放在书签处开始的该组流权标。首先,在概括地关于计算系统的一些介绍性讨论之后,将参考图1描述基本计算 系统。随后,参考图2到6示出并描述在基于流数据来实例化对象的上下文中使用书签的 各实施例。计算系统现在越来越多地采用各种各样的形式。例如,计算系统可以是手持式设 备、电器、膝上型计算机、台式计算机、大型机、分布式计算系统或甚至常规上不被认为是计 算系统的设备。在本说明书以及权利要求书中,术语“计算系统”被广义地定义为包括包含 至少一个处理器以及其上能含有可由处理器执行的计算机可执行指令的存储器的任何设 备或系统(或其组合)。存储器可采取任何形式,且可取决于计算系统的本质和形式。计算 系统可分布在网络环境上,且可包括多个组成计算系统。参考图1,在其最基本的配置中,计算系统100 —般包括至少一个处理单元102和 存储器104。存储器104可以是物理系统存储器,它可以是易失性的、非易失性的或两者的 某种组合。术语“存储器”也可在此处用来指示诸如物理存储介质等非易失性大容量存储。 如果计算系统是分布式的,则处理、存储器、和/或存储能力也可以是分布式的。如此处所 使用的,术语“模块”或“组件”可以指在计算系统上执行的软件对象或例程。此处描述的 不同的组件、模块、引擎和服务可被实现为在计算系统上执行的对象或进程(例如,作为分 开的线程)。在以下描述中,参考由一个或多个计算系统执行的动作描述各实施例。如果这样 的动作用软件实现,则相关联计算系统中执行该动作的一个或多个处理器响应于执行了计 算可执行指令而引导计算系统的操作。这样的操作的示例涉及对数据的操纵。计算机可执 行指令(和所操纵的数据)可被存储在计算系统100的存储器104中。计算系统100还可包含允许计算系统100例如通过网络110与其他计算系统通信 的通信信道108。通信信道108是通信介质的示例。通信介质一般用诸如载波或其他传输 机制等已调制数据信号来体现计算机可读指令、数据结构、程序模块或其他数据,并且包括 任何信息传递介质。作为示例而非限制,通信介质包括有线介质,诸如有线网络或直接线连 接,以及无线介质,诸如声学、无线电、红外线和其他无线介质。如此处所用的术语“计算机 可读介质”既包括存储介质又包括通信介质。在图1中,计算系统100被示为通过容许限度108接收流数据112。流数据112表 示将使得处理器112在存储器104中实例化一个或多个对象的对象实例化指令。具体而言, 对象114被示为在存储器104的易失性部分内实例化。对象114可以响应于流数据112来 实例化。流数据可以通过图1所示的网络来接收,但也可以通过任何其他数据信道来接收。 例如,流数据可以从本地盘、存储器棒、光盘驱动器等获得。关于该过程的更多信息将参考 图2及后续附图并且参考若干详细但非限制性的示例来讨论。本发明的范围内的实施例也包括用于携带或其上储存有计算机可执行指令或数 据结构的计算机可读介质。这样的机器可读介质可以是可由通用或专用计算机访问的任 何可用介质。作为示例而非限制,这样的计算机可读介质可包括物理存储和/或存储器介 质,诸如RAM、ROM、EEPROM、CD-ROM或其他光盘存储、磁盘存储或其他磁存储设备、或可用于
6承载或存储计算机可执行指令或数据结构形式的所需程序代码装置且可由通用或专用计 算机访问的任何其他介质。当信息在网络或另一通信连接(硬连线、无线或硬连线或无线 的组合)上传输或提供给计算机时,计算机将连接完全视为计算机可读介质。因此,任何这 样的连接被适当地称为计算机可读介质。上述的组合也应被包括在计算机可读介质的范围 内。计算机可执行指令例如包括,使通用计算机、专用计算机、或专用处理设备执行某 一功能或某组功能的指令和数据。尽管用对结构特征和/或方法动作专用的语言描述了本 主题,但可以理解,所附权利要求书中定义的主题不必限于在此所述的具体特征或动作。相 反,在此所述的具体特征和动作是作为实现权利要求的示例形式公开的。图2示出其中使用流数据来在存储器中实例化对象的软件体系结构200。在物理 层,流数据仅仅是以诸如电或光信号等某一物理形式表示的一系列数字位。流数据201被 示为是二进制1和二进制0的二进制序列。读取器211可用硬件、软件、固件、或其组合来实现。在一个实施例中,读取器211 本身是在存储器中实例化的对象。读取器包含将接收到的数据流201转换成一系列权标 202的逻辑,每一权标表示实例化上下文并且一些权标表示实例化指令。这一转换过程可以在若干步骤中执行。例如,如果数据流201表示的该组实例化 指令是标记语言文档(例如,可扩展标记语言(XML)文档),则这些权标可表示特定元素的 开始、特定元素的结束、元素的内容、元素的属性,等等。读取器211因而可以首先将每一 个位序列段转换成特定字符。例如,对于表示ASCII字符的位序列,每一个位序列可以是 8位。然而,字符也可由其他位序列长度来表示,如在使用Unicode字符或可能其他字符集 的情况下。读取器211随后解析字符流以寻找表示分层标记语言文档的逻辑部分的逻辑段 (即,权标)。读取器211还可执行任何流控制和有限缓冲来提供权标流202。导航器212也可用硬件、软件、固件、或组合来实现成一组件。在一个实施例中,导 航器212本身可以是在存储器中实例化的对象。导航器212从读取器211接收权标202。 读取器211能以推送的方式将权标202提供给导航器212。然而,为降低或消除缓冲要求, 并且在以下详细讨论的各示例中,导航器212响应于对每一权标的显式导航器请求以拉取 的方式从读取器211 —次接收一个权标。导航器212包括准许导航器用书签来标记权标流203的加书签机制205。导航器 212将权标流203提供给实例化管理器213,实例化管理器213实际上在存储器214中实例 化对象。被提供给实例化管理器213的权标流203中提供的权标是与到导航器212的权标 流202中提供的权标相同的权标。然而,如下所述,由于加标签机制205,这些权标在权标流 203中可以按与权标流202相比不同的次序来提供。实例化管理器213可以使导航器212 在权标流202中创建书签。每一书签表示稍后要返回到的特定权标,其模拟在用书签标记 的权标处开始的权标流的重放。导航器212可以通过在缓冲区206中缓冲在该书签处开始 的权标流来重放权标流。所缓冲的权标流稍后在释放书签时可被释放,并且权标流可以从 缓冲区重放。实例化管理器213实际上响应于其从导航器212接收到的权标流202所表示的实 例化指令在存储器214中实例化对象。术语“权标流”参考从导航器212提供给实例化管 理器213的权标序列来松散地使用,因为实例化管理器213可返回以重放权标流的先前部分。实例化管理器213还可以用硬件、软件、固件、或组合来实现,并且甚至可以是在存储器 中实例化的对象,并且可能处于它在其中实例化对象的同一存储器214中。实例化管理器213能够访问类定义的集合204。在所示示例中,实例化管理器213 能够访问三个特定类定义204A、204B、204C。然而,实例化管理器213能够访问如使用省略 号204D来象征性地表示的任何数量(一个或两个)的类定义。实例化管理器213可以在 存储器214中实例化任何数量的对象。例如,实例化管理器被示为在存储器中实例化了三 个对象205A、205B及205C,但实例化管理器213可以在存储器中实例化任何数量的对象,如 省略号205D所示。对象实例可以根据该对象的对应类定义来在存储器中进行分配。图3示出供导航器便于响应于流权标来实例化对象的方法300的流程图。方法300 可以在每次导航器确定实例化管理器对权标流中的下一权标做好准备时执行(动作301)。 回想权标流中的每一权标表示实例化管理器的某一实例化上下文。从导航器提供给实例化管理器的权标流可以是实况权标流,其中导航器在从读取 器接收到权标时就提供这些权标。然而,权标流也可以处于重放模式,在这种情况下,导航 器将来自其缓冲区的权标提供给实例化管理器。对于特定权标流中的第一权标,该权标流 是实况的(判定框302中的“实况”)。在实况权标流(判定框302中的“实况”)的情况下,导航器从读取器获得该流的 下一权标(动作303)。在拉取机制中,导航器可以显式地作出对来自读取器的下一权标的 请求,并且作为对该请求的响应来接收该权标。如果权标流中设置了先前的书签(判定框 304中的“是”),则导航器缓冲刚从读取器获得的权标(动作305),并且还将该权标提供给 实例化管理器(动作306)。在缓冲之前将权标提供给实例化管理器也是可能的。因此,对 于动作305和306而言,没有相对的时序要求。如果权标流中没有设置先前的书签(判定 框304中的“否”),则导航器将权标提供给实例化管理器(动作306)而不必缓冲该权标。在一个实施例中,缓冲区206被实现成单链表,缓冲区开头中的每一权标都与该 单链表中的一节点相关联。除该单链表中的最终节点之外,每一节点还包括到该列表中的 下一节点的链接。使用该权标流的所有书签共享该链表。在实况权标流(判定框302中的 “实况”)的情况下,如果不存在先前的书签(判定框304中的“否”),则缓冲区中不存在权 标并且该链表将具有长度0。然而,在其中存在先前书签(判定框304中的“是”)的实况 权标流(判定框302中的“实况”)的情况下,则通过在单链表中创建附加节点并将该列表 中的之前的最后节点链接到新创建的附加节点来将权标添加到该列表中。另一方面,在重放权标流(判定框302中的“重放”)的情况下,导航器提供来自 其缓冲区的下一权标(动作307)而非必须从读取器获得下一权标。如果权标流中存在先 前的书签(判定框308中的“是”),则导航器将来自其缓冲区的权标提供给实例化管理器 (动作306)。如果权标流中不存在先前的书签(判定框308中的“否”),则在将该权标提 供给实例化管理器(动作306)之前、同时、和/或之后,导航器自由地(但不必)释放与缓 冲该权标相关联的存储器(动作309)。在链表实施例中,在导航器重放来自缓冲区的权标 时,导航器使造成该重放的书签前进到该链表中的下一权标。如果该书签是该链表中的最 早书签,则该书签前进将不再访问的已过权标。垃圾收集模块可周期性地检测链表中的这 些未使用的模块,并可以从链表中移除这些权标。图4示出使导航器用书签来标记权标的方法400的流程图。具体而言,在从实例
8化管理器接收到用书签来标记特定权标的请求时启动加书签(动作401)。导航器随后可用 书签来标记权标(动作402),并且还开始缓冲该权标(动作403)。当然,这一加书签可以 影响图3的方法300对于在该书签有效时接收到的后续权标的流程。图5示出可使导航器进入重放模式从而从先前书签重放权标流的方法500的流程 图。具体而言,导航器从实例化管理器接收重放在特定用书签标记的权标处开始的流权标 的请求(动作501)。导航器随后通过返回到作为要提供给实例化管理器的下一权标的用书 签标记的权标来进入重放模式(动作502)。图6示出供实例化管理器从导航器接收一组权标的方法600的流程图。方法600 在每一次实例化管理器从导航器接收权标时启动(动作601)。一开始,实例化管理器决定 其当前是否能够履行由接收到的指令所表示的任何实例化指令(判定框602)。如果实例化管理器当前能够履行实例化指令(判定框602中的“是”),则实例化 管理器确实履行该实例化指令(动作603)。另外,如果存在先前用书签标记的权标,并且实 例化指令允许实例化管理器执行先前用书签标记的实例化权标(判定框605中的“是”), 然后实例化管理器重放在该先前用书签标记的权标处开始的权标(动作606)。例如,实例 化管理器可以向导航器提供重放指令,从而使得导航器执行图5的方法500。否则(判定框 605中的“否”),实例化管理器简单地等待下一权标(动作607),可任选地向导航器通知实 例化管理器对下一权标已就绪。如果实例化管理器当前不能够履行实例化指令(判定框602中的“否”),则实例 化管理器用书签标记当前权标(动作608)。例如,实例化管理器可以请求导航器用书签标 记使得导航器执行图4的方法400的权标。实例化管理器随后等待下一权标(动作607)。因此,在实例化管理器不能够立即对特定权标进行响应时,本文描述的各实施例 准许重放权标流。实例化管理器可以用书签标记该权标,并在该实例化管理器变得准备好 接收该用书签标记的权标所提供的实例化上下文时返回以重放在该权标处开始的流。现在将提供两个非常具体的示例。在每一具体示例中,将用》1来提供类定义。另 外,将提供特定权标流和相关联的分层标记语言文档以示出如何根据具体实施例来处理权 标。这些示例只是出于说明性目的来提供的。第一示例较简单,因为它只描述一层标签。该 第一示例可被称为“单书签”示例。第二示例更加复杂,并且示出若干层书签,在此被称为 “多书签”示例。在单书签示例中,目标是创建遵循以下定义的类的对象实例public class Monster<Tffeapon>{public int SizeInMeters{get ;set ;}public string Name{get ;set ;}}Monster (怪物)类是需要类自变量TWeapon (武器)来分配Monster类的通用类, 因为Monster对象的结构将取决于TWeapon类型自变量。以下是实例化指令的集合的并行 化形式的示例〈Monster〉<Monster. SizeInMeters>100</Monster. SizeInMeters)
9
<xTypeArguments>Fire</χTypeArguments>〈Monster. Name>Godzi1la</Monster. Name)〈/Monster〉读取器从位流中提取的对应权标序列将如下表现1 起始元素Monster2起始元素Monster. SizeInMeters (怪物.以米为单位的大小)3 文本1004 结束元素Monster· SizeInMeters5起始元素x TypeArguments (类型自变量)6 文本Fire(火)7 结束元素x: TypeArguments8起始元素=Monster. Name (怪物.名称)9 文本Godzilla(哥斯拉)10 结束元素Monster. Name11 结束元素Monster将权标1从导航器提供给实例化管理器。然而,实例化管理器尚不能够创建 Monster对象,因为类型自变量TWeapon未知。回想在这一示例中Monster类是通用类,并 且因此在知道对象的结构之前需要类型自变量。因为尚不知道对象的结构,实例化管理器 使得导航器用书签标记权标1,因此导航器缓冲权标1。随后,导航器将权标2、3和4提供 给实例化管理器,并且导航器也缓冲这些权标。实例化管理器仍然不能够处理权标2-4,因 为Monster对象尚未创建,并且对这些权标的遵从需要Monster对象的存在。导航器随后将权标5 “起始元素uJypeArguments”提供给实例化管理器,从而提 示实例化管理器其将要接收到创建Monster对象所需的类型自变量。导航器随后将权标6 “文本Fire”提供给实例化管理器,这告诉实例化管理器 Monster类的类型自变量是“Fire”。此时,或可能在实例化管理器接收到权标7 “结束元 素X:TypeArgUmentS”后,实例化管理器知道类型自变量是“Fire”。实例化管理器指示导 航器从先前书签处(其在权标1处)重放。在实例化管理器再次接收到权标1时,其将创建Monster对象。然而,现在,实例 化管理器知道了类型自变量将是“Fire”。因此,实例化管理器创建MonsteKFire〉对象。 在这一阶段,可以从缓冲区释放权标1,因为只存在使用该缓冲区的一个书签,并且因为该 书签现在将前进到缓冲区中的权标2。当随后从导航器缓冲区重放权标2 “起始元素=Monster. SizeInMeters"时,实例 化管理器准备好向Monster<Fire>对象的SizeInMeters属性进行写入。在这一阶段,权标 2可以但不必从缓冲区释放。例如,书签可在缓冲区的单链表表示中前进到权标3。随后, 垃圾收集模块可检测到不再使用链表中的表示权标1和2的节点。当重放权标3 “文本100”时,实例化管理器将值“100”写到MonsteKFire〉对象 的SizeInMeters属性。权标3随后可以从缓冲区丢弃。当随后从导航器缓冲区重放权标4 “结束元素=Monster. SizeInMeters"时,实例 化管理器知道向SizelnMeters属性的写入已完成。权标4随后可以从缓冲区丢弃。
10
当从导航器缓冲区重放权标5到7时,实例化管理器无需采取动作,因为类型自变 量已被设置,并且实际上是在创建MonsteKFire〉对象之前需要的。权标5到7随后可以 从缓冲区丢弃。当实例化管理器接收到权标8 “起始元素=Monster. Name"时,退出重放模式并进 入实况模式,因为导航器现在并非从其缓冲区(其现在是空的)提供权标而是从访问位流 的读取器的权标。实例化管理器准备好向MonsteKFire〉对象的Name属性进行写入。当实例化管理器接收到权标9 “文本GodZilla”时,值“Godzilla”被写到 Monster<Fire> 对象的 Name 属性。有了权标10 “结束元素=Monster. Name",实例化管理器知道其完成了对Name属 性的写入。有了权标11 “结束元素M0nSter”,实例化管理器知道其完成了对MonsteKFire〉 对象的创建和填充。因此,在该单书签示例中,准许实例化管理器用书签标记权标,从而允许实例化管 理器在其具有与该用书签标记的权标相对应的适当上下文时稍后返回到该权标。虽然进行 了一些缓冲,但未缓冲整个实例化指令集。下一示例是多书签示例。在该具体示例中,存在三个相关的类定义,针对City (城 市)的一个,针对Country (国家)的一个,以及针对Monster的新的一个,如下用C#编写。public class City{public City (Country country);public string Name{get ;set ;}public string Population{get ;set ;}}public class Country{public string Name{get ;set ;}}public class Monster{public Monster(City home);public int SizeInMeters{get ;set ;}public Color SkinColor{get ;set ;}}这是我们希望并行化的标记。注意,在该示例中,x:ConstructorArguments (构造 函数自变量)包含要传递给构造函数以创建对象的一串对象。〈Monster〉<Monster. SizeInMeters>100</Monster. SizeInMeters)<x:ConstructorArguments><City>
<City. Name>Tokyo</City. Name)〈City. Population>12800000</City. Population〉<x:ConstructorArguments><Country><Country. Name>Japan</Country. Name></Country></χ:ConstructorArguments></City></χ:ConstructorArguments><Monster. SkinColor>Green</Monster. SkinColor>〈/Monster〉以下是其作为权标序列的表示1 起始元素Monster2 起始元素Monster. SizeInMeters3 文本1004 结束元素Monster. SizeInMeters5 起始元素:x ConstructorArguments6起始元素City7起始元素City. Name (城市.名称)8 文本Tokyo (东京)9 结束元素City. Name10 起始元素City. Population(城市.人口)11 文本1280000012 结束元素City. Population13 起始元素:x ConstructorArguments14 起始元素Country15起始元素Country. Name (国家.名称)16 文本 Japan(日本)17 结束元素Country. Name18 结束元素Country19 结束元素:x ConstructorArguments20 结束元素City21 结束元素:x ConstructorArguments22 起始元素Monster. SkinColor (怪物.肤色)23 文本=Green (绿色)24 结束元素Monster. SkinColor25 结束元素:Monster导航器首先确定实例化管理器对权标流的第一权标1已就绪。在其中实例化管理 器驱动导航器的实施例中,导航器可以接收来自实例化管理器的就绪指示符。在另一实施
12例中,可能仅仅是导航器未接收到来自实例化管理器的“未就绪”指示符,从而使导航器假 定实例化管理器对权标流的第一权标1已就绪。或者,导航器可简单地假定实例化管理器 总是就绪而不与实例化管理器进行任何通信。在确定实例化管理器已就绪后,导航器指示读取器从权标序列获得第一权标。读 取器将权标1 “起始元素Monster”提供给导航器。因为导航器现在向实例化管理器提供 权标流实况,所以导航器将权标1 “起始元素Monster”提供给实例化管理器。实例化管理器引用需要City构造函数自变量的Monster类。然而,实例化管理器 尚未具有City构造函数自变量。因此,实例化管理器尚不能履行权标1所表示的实例化指 令。实例化管理器指示导航器用书签标记权标1。因为在该示例中存在要使用的多个书签, 所以这将被称为“第一”书签。导航器在权标1 “起始元素Monster”处维护第一书签并缓 冲权标1。导航器将继续缓冲后续权标,直至释放该书签为止。实例化管理器还可以注意到 将允许实例化管理器返回到该书签的事件即,创建了 Monster类的所有构造函数自变量 (即City对象)。导航器随后指示读取器从位流获得下一权标。读取器将权标2 “起始元素 Monster. SizelnMeters”提供给导航器。导航器将该权标与权标1 一起缓冲,并将权标2“起 始元素=Monster. SizelnMeters”提供给实例化管理器。实例化管理器仍然不能处理权标 1,因为仍然需要构造函数自变量。导航器指示读取器从位流获得下一权标。读取器将权标3 “文本100”提供给导 航器。导航器缓冲权标1-3,并将权标3 “文本100”提供给实例化管理器。实例化管理 器仍然不能采取动作,因为此时甚至未创建Monster对象。该过程也对权标4 “结束元素 Monster. SizelnMeters,,重复。导航器指示读取器从位流获得下一权标。读取器将权标5 “起始元素 ^ConstructorArguments”提供给导航器。导航器缓冲权标1_5,并将权标5 “起始元素 ^ConstructorArguments”提供给实例化管理器。实例化管理器仍然不能采取动作,因为此 时甚至未创建Monster对象。实例化管理器可任选地准备创建构造函数对象。导航器指示读取器从位流获得下一权标。读取器将权标6 “起始元素City”提供 给导航器。导航器缓冲权标1-6,并将权标6 “起始元素City”提供给实例化管理器。实 例化管理器仍然不能对权标1处的第一书签采取动作,因为此时甚至未创建Monster对象。 此外,权标6指示实例化管理器将City对象实例化。实例化管理器引用City类,但尚不 能实例化City对象,因为需要Country构造函数。因此,实例化管理器指示导航器在权标 6 “起始元素City”处创建另一书签(“第二”书签)。因此,现在权标流中存在两个书签, 权标1 “起始元素Monster”处的第一书签和权标6 “起始元素City”处的第二书签。导 航器随后创建第二书签。实例化管理器还可以注意到将允许实例化管理器返回到该第二书 签的事件即,创建并填充了 Country对象。导航器指示读取器从位流获得下一权标。读取器将权标7“起始元素City. Name" 提供给导航器。导航器缓冲权标1-7,并将权标7 “起始元素City. Name”提供给实例化管 理器。实例化管理器仍然不能对权标1 “起始元素Monster”处的第一书签采取动作,因为 此时甚至未创建Monster对象。此外,实例化管理器不能对权标6 “起始元素City”处的 第二书签采取动作,因为尚未创建City对象,因为需要Country构造函数自变量。这一过
13程对权标 8 “文本Tokyo”、9 “结束元素=City. NameMO “起始元素=City. Population", 11 “文本:12800000”、以及12 “结束元素City. Population”重复。每一个都作为实况权 标流从导航器提供给实例化管理器,每一个都由导航器缓冲,并且实例化管理器不能对它 们做任何事情,因为Monster和City对象尚未被创建。在导航器将权标13 “起始元素ufonstructorArguments”提供给实例化管理器 时,提示实例化管理器将要提供City类的构造函数自变量。在这一阶段,导航器缓冲权标 1-13。导航器指示读取器从位流获得下一权标。读取器将权标14 “起始元素C0Untry” 提供给导航器。导航器缓冲权标1-14,并将权标14 “起始元素C0Untry”提供给实例化管 理器。这一权标指示实例化管理器将Country对象实例化。Country类被引用。在可分配 Country对象之前不需要构造函数、类型自变量、或任何其他信息。因此,实例化管理器在存 储器中分配Country对象,如Country类所定义的。导航器指示读取器从位流获得下一权标。读取器将权标15 “起始元素=Coimtry. Name”提供给导航器。导航器缓冲权标1_15,并将权标15 “起始元素=Coimtry. Name”提供 给实例化管理器。实例化管理器准备好向新实例化的Country对象的Name属性写入值。导航器指示读取器从位流获得下一权标。读取器将权标16 “文本Japan”提供给 导航器。导航器缓冲权标1-16,并将权标16 “文本Japan”提供给实例化管理器。实例化 管理器向Country对象的Name属性写入值“Japan”。读取器将权标17 “结束元素=Coimtry. Name"提供给导航器。导航器缓冲权标 1-17,并将权标17提供给实例化管理器。实例化管理器注意到其现在完成了对Country对 象的Name属性的写入。读取器将权标18 “结束元素C0Untry”提供给导航器。导航器缓冲权标1_18,并 将权标18提供给实例化管理器。实例化管理器注意到其现在完成了对Country对象的实 例化和填充。实例化管理器现在具有Country对象来用作City对象的构造函数,并且现在 可创建City对象。这是将允许实例化管理器返回到第二书签的事件。实例化管理器指示 导航器重放在最后书签处(在该示例中这是权标6处的第二书签)开始的权标流。随后移 除第二书签,从而只留下权标1 “起始元素Monster”处的第一书签。不需要来自读取器的任何信息,导航器从其缓冲区中将权标6 “起始元素City” 提供给实例化管理器。实例化管理器注意到它拥有了 City类的所有构造函数自变量,并且 因而实例化City对象。实例化管理器仍然不能处理权标1,因为即使实例化了 City对象它 也尚未足够准备好用作Monster对象的构造函数自变量。导航器随后将权标7 “起始元素City. Name”从其缓冲区中提供给实例化管理器。 实例化管理器准备好向City对象的Name字段进行写入。导航器随后将权标8 “文本Tokyo”从其缓冲区中提供给实例化管理器。实例化 管理器写入“Tokyo”作为City对象的Name字段的值。导航器随后将权标9 “结束元素City. Name”从其缓冲区中提供给实例化管理器。 实例化管理器注意到,Name属性的值写入操作已完成。导航器随后将权标10 “起始元素City. Population”从其缓冲区中提供给实例化 管理器。实例化管理器准备好向City对象的Population字段写入值。
导航器随后将权标11 “文本12800000”从其缓冲区中提供给实例化管理器。实 例化管理器向City对象的Population属性写入值“ 12800000”。导航器随后将权标12 “结束元素City. Population”从其缓冲区中提供给实例化 管理器。实例化管理器注意到,对Population属性的写入操作已完成。导航器随后将权标13 “起始元素ufonstructorArguments”从其缓冲区中提供 给实例化管理器。实例化管理器准备好用构造函数自变量来填充City对象。导航器随后将权标14 “起始元素C0Untry”从其缓冲区中提供给实例化管理器。 实例化管理器已经创建了 Country对象,并且因而用该Country对象填充City对象。导航器随后顺序地将权标14-18从其缓冲区中提供给实例化管理器。然而,实例 化管理器已经执行了这些权标所需的动作,因为Country对象已被创建。因此,权标14-48 无需特别的动作。在一个实施例中,在对特定权标采取动作时,该权标可被标志成完成,使 得在向实例化管理器重放权标流时导航器甚至不提供该权标。在这种情况下,例如,权标 14-18可被标志。或者,实例化管理器可以查看标志并尝试不采取动作。导航器随后准备将下一权标(权标19)发送到实例化管理器。然而,导航器只具 有在这一阶段缓冲的权标1-18。导航器因此退出重放模式并再次进入实况模式。导航器因 而向读取器请求下一权标。读取器将权标19 “结束元素fonstructorArguments”提供给 导航器。导航器缓冲权标1-19 (因为仍然存在先前书签),并将权标19提供给实例化管理 器。实例化管理器注意到,City对象的构造函数自变量已完成。读取器将权标20“结束元素City”提供给导航器。导航器缓冲权标1_20,并将权 标20提供给实例化管理器。实例化管理器注意到,City对象现在已完成。因为City对象 已完成,所以实例化管理器现在准备好处理需要City对象作为构造函数自变量的权标1。 实例化管理器注意到,发生了与返回到第一书签相对应的事件。实例化管理器指示导航器 从最后书签处重放,该最后书签是权标1 “起始元素Monster”处的第一书签,因为在权标 6处的第二书签之前已被删除。导航器从权标1处重放,并删除第一权标。导航器将权标1 “起始元素Monster” 从其缓冲区中提供给实例化管理器。实例化管理器引用Monster类,并注意到其现在包含 Monster类的所有构造函数自变量(即City对象),并且因而分配Monster对象。可任选 地,因为权标流中没有更多书签,所以在将权标提供给实例化管理器时导航器可以从其缓 冲区中释放每一权标。或者,一旦缓冲区的重放完成并且导航器再次进入实况模式且权标 流中没有剩余书签,则导航器可以释放整个缓冲区。导航器将权标2 “起始元素=Monster. SizelnMeters”从其缓冲区中提供给实例化 管理器。实例化管理器准备好向Monster对象的SizelnMeters属性写入值。可任选地,权 标2随后从缓冲区中释放,但如上所述,缓冲区可以稍后释放。导航器将权标3 “文本100”从其缓冲区中提供给实例化管理器。实例化管理器 向Monster对象的SizelnMeters属性写入值“100”。导航器将权标4 “结束元素=Monster. SizelnMeters”从其缓冲区中提供给实例化 管理器。实例化管理器注意到其完成了对Monster对象的SizelnMeters属性的写入。导航器将权标5 “起始元素ufonstructorArguments”从其缓冲区中提供给实例 化管理器。实例化管理器准备好用构造函数自变量来填充Monster对象。
导航器将权标6 “起始元素City”从其缓冲区中提供给实例化管理器。实例化管 理器使用City对象来填充Monster对象。导航器一次一个地将权标7-20依次从其缓冲区提供给实例化管理器。实例化管 理器基本上不采取响应于权标7-02的动作,因为City对象已被构造。因为导航器重放了 其缓冲区中的所有权标(即,权标1-20),所以导航器不再缓冲各权标并且现在进入实况模 式,在该模式中从读取器获取新权标。导航器请求读取器提供位流中的下一权标。读取器将权标21 “结束元素 ^ConstructorArguments”提供给导航器。导航器处于实况模式,且权标流中当前没有书 签。因此,无需缓冲权标21。相反,导航器在不缓冲的情况下将权标21提供给实例化管理 器。实例化管理器注意到,Monster对象的构造函数自变量已完成。读取器将权标22 “起始元素=Monster. SkinColor”提供给导航器,导航器在不 缓冲的情况下将该权标中继给实例化管理器。实例化管理器准备好向Monster对象的 SkinColor属性写入值。读取器将权标23 “文本Green”提供给导航器,导航器在不缓冲的情况下将该权 标中继给实例化管理器。实例化管理器向Monster对象的SkinColor属性写入值“Green”。读取器将权标24 “结束元素=Monster. SkinColor”提供给导航器,导航器在不缓 冲的情况下将该权标中继给实例化管理器。实例化管理器注意到,其完成了对SkinColor 属性的值写入操作。读取器将权标25 “结束元素Monster”提供给导航器,导航器在不缓冲的情况下 将该权标中继给实例化管理器。实例化管理器注意到,其完成了对Monster对象的创建。实 例化管理器也已响应于权标流的所有实例化指令完成。虽然执行了一些缓冲,但这一缓冲小于权标流中的所有权标。使用本文描述的实 施例,即使权标流不是以实例化管理器总是知道如何处理特定实例化权标的方式来编写 的,也可以评估一些权标流而只缓冲整个权标流的一小部分。因此,在不需要权标流的任何 特殊结构要求的情况下降低了基于权标流的实例化的缓冲要求。本发明可具体化为其他具体形式而不背离其精神或本质特征。所描述的实施例在 所有方面都应被认为仅是说明性而非限制性的。从而,本发明的范围由所附权利要求书而 非前述描述指示。落入权利要求书的等效方案的含义和范围内的所有改变应被权利要求书 的范围所涵盖。
1权利要求
一种供流权标导航器(212)向实例化管理器(213)提供一组流权标(203)的方法,所述一组流权标表示实例化指令的集合,所述方法包括所述导航器接收表示实例化指令的特定权标的动作(303);所述导航器一开始将所述特定权标提供给所述实例化管理器的动作(动作306);所述导航器从所述实例化管理器接收在所述特定权标处用书签来标记所述一组流权标的请求的动作(401),其中所述书签指示所述导航器要缓冲至少在所述特定权标处开始的所述一组流数据;所述导航器接收所述一组流权标的一个或多个后续权标的动作(303);所述导航器缓冲所述特定权标和所述一个或多个后续权标的动作(305);所述导航器一开始将所述一个或多个后续权标提供给所述实例化管理器的动作(306);在所述导航器一开始将所述一个或多个后续权标提供给所述实例化管理器后,所述导航器从所述实例化管理器接收重放在所述特定权标处开始的所述一组流权标的请求的动作(501);以及响应于来自所述实例化管理器的重放请求,导航器将所述特定权标和所述一个或多个后续权标以其在所述一组流权标内的正确次序重放给所述实例化管理器的动作(502)。
2.如权利要求1所述的方法,其特征在于,所述特定权标是所述一组流权标的第一个 权标。
3.如权利要求1所述的方法,其特征在于,所述特定权标是所述一组流权标的中间权标。
4.如权利要求3所述的方法,其特征在于,还包括在所述导航器一开始将所述特定权 标提供给所述实例化管理器的动作之前的以下动作;所述导航器接收所述一组流权标中的先前权标的动作; 所述导航器一开始将所述先前权标提供给所述实例化管理器的动作; 所述导航器从所述实例化管理器接收在所述先前权标处用书签来标记所述一组流权 标的请求的动作,其中所述书签指示所述导航器至少要在所述先前权标处开始进行缓冲; 以及所述导航器缓冲所述先前权标、以及所述权标流中的所述先前权标与所述特定权标之 间的任何居间权标的动作。
5.如权利要求4所述的方法,其特征在于,还包括在所述导航器重放所述特定权标和 所述一个或多个后续权标的动作之后的以下动作所述导航器从所述实例化管理器接收重放在所述先前权标处开始的所述一组流权标 的请求的动作;以及响应于来自所述实例化管理器的在所述先前权标处开始进行重放的请求,所述导航器 向所述实例化管理器重放所述先前权标、所述先前权标与所述特定权标之间的任何居间权 标、所述特定权标、以及所述一个或多个后续权标的动作。
6.如权利要求5所述的方法,其特征在于,还包括在所述先前权标处开始进行重放的 动作之后和/或同时的以下动作释放包括所述先前权标、所述先前权标与所述特定权标之间的任何居间权标、所述特定权标、以及所述一个或多个后续权标的缓冲区的动作。
7.如权利要求1所述的方法,其特征在于,还包括在所述特定权标处开始进行重放的 动作之后和/或同时的以下动作释放包括所述先前权标、所述先前权标与所述特定权标之间的任何居间权标、所述特 定权标、以及所述一个或多个后续权标的缓冲区的动作。
8.一种供实例化管理器(213)从导航器(202)接收一组权标(203)的方法,所述导航 器接收所述一组权标作为流权标,所述一组权标表示实例化指令的集合,所述方法包括所述实例化管理器从导航器接收所述一组权标中的特定权标的动作(601),所述导航 器被配置成接收所述一组权标作为流权标,所述特定权标表示一实例化指令;所述实例化管理器确定所述实例化管理器尚不能操作由所述特定权标所表示的实例 化指令的动作(602);所述实例化管理器指示所述导航器在所述特定权标处用书签标记所述一组权标的动 作(603);所述实例化管理器从所述导航器接收所述一组权标的一个或多个后续权标的动作 (601);确定所述一个或多个后续权标的最后权标准许所述实例化管理器操作由所述特定权 标所表示的实例化指令的动作(602、603、605);以及重放在所述特定用书签标记的权标处开始的所述一组权标的动作(606)。
9.如权利要求8所述的方法,其特征在于,所述权标集合中的每一权标包括标记语言 文档的一部分。
10.如权利要求8所述的方法,其特征在于,所述特定权标表示实例化特定类的对象的 指令,其中所述实例化管理器确定所述实例化管理器尚不能操作由所述特定权标所表示的 实例化指令的动作包括以下动作在可分配所述特定类的对象之前确定需要一个或多个信息项的动作。
11.如权利要求10所述的方法,其特征在于,所述特定类是通用类,所述一个或多个信 息项至少包括准许标识所述通用类中的具体类的类型自变量。
12.如权利要求10所述的方法,其特征在于,所述一个或多个信息项至少包括一个或 多个构造函数自变量。
13.如权利要求8所述的方法,其特征在于,所述一组流权标中的每一个表示实例化上 下文,但并非所述一组流权标中的全部都表示实际的实例化指令。
14.如权利要求8所述的方法,其特征在于,重放在所述特定用书签标记的权标处开始 的所述一组权标的动作包括所述实例化管理器指示所述导航器重放在所述特定权标处开始的所述一组权标的动作;所述实例化管理器从所述导航器接收在所述特定权标处开始的所述一组权标的重放 的动作;以及在所述实例化管理器接收在所述特定权标处开始的所述一组权标的重放时,所述实例 化管理器遵循从所述导航器接收到的实例化指令的动作。
15.如权利要求8所述的方法,其特征在于,所述导航器缓冲少于所述一组权标的全部。
16.一种包括其上具有计算机可执行指令的一个或多个计算机可读介质的计算机程序 产品(104),当所述指令由计算系统(100)的一个或多个处理器(102)执行时,使所述计算 系统实例化导航器(202)和实例化管理器(213),其中所述导航器被配置成接收一组流权标(112),并将所述一组流权标(203)提供给 所述实例化管理器,所述导航器还被配置成即使是在所述一组流位置的中间也用书签标记 所述一组流权标,并且被配置成重放在书签处开始的所述一组流权标;以及其中所述实例化管理器被配置成对从所述导航器接收到的每一权标执行以下动作确定所述实例化管理器当前是否能够履行由接收到的权标所表示的实例化指令 (602);如果所述实例化管理器当前能够履行所述实例化指令,则履行所述实例化指令(603);以及如果所述实例化管理器当前不能够履行所述实例化指令,则指示所述导航器用书签标 记所述权标(608),因此在所述实例化管理器接收到准许所述导航器履行由所述用书签标 记的权标所表示的实例化指令的后续权标(602)时,所述实例化管理器履行由所述用书签 标记的权标所表示的实例化指令(603),并重放所述一组流权标中的后续权标(606)。
17.如权利要求16所述的计算机程序产品,其特征在于,所述一个或多个计算机可读 介质是物理存储器和/或存储介质。
18.如权利要求16所述的计算机程序产品,其特征在于,所述导航器还被配置成控制 一缓冲区,响应于来自所述实例化管理器的书签指令可在所述缓冲区中缓冲少于所述一组 权标中的全部权标。
19.如权利要求16所述的计算机程序产品,其特征在于,所述实例化管理器能够访问 类定义的集合。
20.如权利要求16所述的计算机程序产品,其特征在于,所述计算机可读介质上还具 有所述类定义。
全文摘要
对一组流权标中的权标加书签,每一个权标都表示实例化指令或实例化上下文。导航器接收一组流权标,并将这些权标提供给实例化管理器。然而,如果导航器接收到用书签来标记特定权标的指令,则导航器缓冲至少在该用书签标记的权标处开始(并且在存在先前书签的情况下甚至可能更早)的该组流指令。导航器响应于来自实例化管理器的指令来重放在书签处开始的该组流权标。实例化管理器接收该组流权标。如果实例化管理器目前不能处理特定权标的指令,则实例化管理器指示导航器用书签来标记该特定权标。在实例化管理器稍后接收到准许该实例化管理器返回到该书签的权标时,该实例化管理器返回到书签以重放在该书签处开始的实例化指令。
文档编号G06F15/16GK101925889SQ200880125603
公开日2010年12月22日 申请日期2008年12月29日 优先权日2008年1月25日
发明者C·L·安德森, J·C·施利梅尔, J·D·多蒂, M·J·加金 申请人:微软公司