文件系统项及相关联实体的串行化的制作方法

文档序号:6554391阅读:173来源:国知局

专利名称::文件系统项及相关联实体的串行化的制作方法
技术领域
:本发明一般涉及对象存储系统,尤其涉及串行化和/或反串行化项及相关联的实体。
背景技术
:传统上,在计算机文件系统中,文件是数据存储的基本单位。通常,文件系统中的文件具有以下特征。它是多个字节的单一序列。它具有定长,且一般存储在非易失性存储介质上。它被创建在目录中,并具有可由文件中操作引用的名称,该名称可能与其路径结合。另外,文件系统可以将其它信息与文件相关联,这些其它信息诸如许可位或其它文件属性;文件创建、最后修订及最后访问的时戳。特定应用程序也可以在文件的字节流中存储域专用属性。例如,由文字处理应用程序使用并因此被认作为“文档”的文件可以存储类似文档的标题和作者的属性。这些属性以创建该文件的应用程序所专用的格式被存储在文件的字节流中。属性不被结构化为对象,也没有标准化的名称。字节流是非结构化的值。另外,常规的计算机文件系统向用户提供了可用的受限文件组织技术。例如,现有的应用程序基本上采用树结构文件夹格式来组织和显示各种类型的文件。尽管可以查看文件夹、子文件夹和文件之间的某些关系,但是这样的关系在范围中是受限的,且主要取决于显式的用户输入。例如,可以按照如用户指示的公共文件夹或子文件夹来相关多个文件。
发明内容以下呈现了本发明的简化概要,以提供对本发明的某些方面的基本理解。该概要不是本发明的宽泛的概观。它不旨在标识本发明的关键/重要的元素,也不描绘本发明的范围。它唯一的目的是以简化的形式呈现本发明的某些概念,作为之后呈现的更详细描述的序言。本发明允许对文件系统项及相关联实体进行串行化和/或反串行化。文件系统“项”包括核心类,例如,联系人,它可以包括属性。项可以是简单或者是复合的(例如,包含嵌入其中的其它项)。与项相关联的可以是诸如片段、与其它项的链接和/或扩展等实体。通过串行化,如果存在项及相关联实体的一致副本,可以对其进行捕捉(例如,用于传送项并在目的地系统上重构该项)。根据本发明的一方面,提供了一种串行化系统。该串行化系统包括标识与项相关联实体的标识组件,以及串行化项及相关联实体的串行化组件。串行化组件还可以串行化包含与项及相关联实体相关联的信息的头部。头部可以便于对项及相关联实体的随机访问(例如,允许读程序仅解释/解析其所感兴趣的部分)。可任选地,串行化系统可以展示便于将项及其相关联实体从一个位置复制、移动和/或传送至另一位置(例如,分离的计算机系统和/或可移动介质)的应用程序编程接口(API)。本发明的另一方面提供了一种可以被用来反串行化项及其相关联实体的项反串行化系统。该反串行化系统可以使用头部来获取对项及相关联实体的随机访问(例如,可以仅解释/解析其感兴趣的部分)。反串行化系统可以在文件系统存储中重新创建项结构。为了达到前述及相关目的,此处结合以下描述及附图描述了本发明的某些说明性方面。然而,这些方面仅指示可在其中使用本发明的原理的各种方式中的少量几种,而本发明旨在包括所有这样的方面及其等效实施方式。当结合附图考虑,通过阅读本发明的以下详细描述时,本发明的其它优点和新颖的特征将变得明显。图1是根据本发明的一方面的串行化系统的框图。图2是根据本发明的一方面的示例性项结构的示意图。图3是根据本发明的一方面的示例性串行化结构的示意图。图4是根据本发明的一方面的串行化系统的框图。图5是根据本发明的一方面的串行化环境的框图。图6是根据本发明的一方面的反串行化系统的框图。图7是根据本发明的一方面的反串行化环境的框图。图8是根据本发明的一方面便于串行化项的方法的流程图。图9是进一步示出图8的方法的流程图。图10是根据本发明的一方面便于反串行化项的方法的流程图。图11是进一步示出图10的方法的流程图。图12示出了其中本发明可以运作的示例操作环境。具体实施例方式现在参考附图描述本发明,在全部附图中,同样的参考标号指的是同样的元素。在以下描述中,为说明起见,描述了众多具体细节,以提供对本发明的全面理解。然而,显然,本发明可以无需这些具体细节而实现。在其它实例中,公知的结构和设备以框图形式示出,以便于描述本发明。如在本申请中所使用的,术语“组件”、“处理程序”、“模型”、“系统”等指的是计算机相关的实体,它们或者是硬件、硬件和软件的组合、软件或者是执行中的软件。例如,组件可以是,但不限于,运行在处理器上的进程、处理器、对象、可执行代码、执行的线程、程序和/或计算机。作为说明,运行在服务器上的应用程序和服务器本身均可以是组件。一个或多个组件可以驻留在执行中的进程和/或线程内,且组件可以位于一台计算机上和/或分布在两台或多台计算机之间。同样,这些组件可以从其上存储各种数据结构的各种计算机可读介质执行。这些组件可以通过本地和/或远程进程通信,诸如根据含有一个或多个数据包的信号(例如,来自一个组件的数据与处于本地系统、分布式系统中的组件和/或跨诸如因特网等网络与其它系统通过信号交互)。根据本发明,计算机组件可以被存储在例如计算机可读介质上,包括但不限于,ASIC(应用专用集成电路)、CD(光盘)、DVD(数字视频盘)、ROM(只读存储器)、软盘、硬盘、EEPROM(电可擦可编程只读存储器)以及记忆棒。本发明允许文件系统项及相关联实体的串行化和/或反串行化。如在本申请中所使用的,文件系统“项”包括核心类,例如联系人,它可以包括多个属性(例如,名字、地址、电话号码)。项可以是简单或复合的(例如,包括嵌入其中的其它项)。与项相关联的可以是实体,诸如项片段、与其它项的链接(例如,关系)和/或扩展(例如,附加属性)。参考图1,示出了根据本发明的一方面的串行化系统100。系统100可以被用来串行化项(例如,核心项)及与项相关联的实体。系统100还可以生成包含与项及相关联的实体相关联的信息的头部,并对其串行化。串行化系统100包括标识与项相关联的实体的标识组件110。标识组件110可以从文件系统存储120中获取关于项的信息。如下所述,信息可以包括,例如项片段、扩展、外向链接和/或嵌入的项。串行化系统100还包括串行化项及相关联实体的串行化组件130。串行化组件130还可以生成包含与项及相关联实体相关联的信息的头部,并对其串行化。头部可以便于对项及相关联实体的随机访问(例如,允许读程序只翻译/解析其感兴趣的部分)。简要地参考图2,示出了根据本发明的一方面的示例性项结构示意图200。在该示例中,核心项210可以包括属性。例如,核心项210可以是具有属性“名字”和“家庭电话号码”的“联系人”。核心项210可以含有由特定应用程序添加的扩展220,来用额外的属性扩展核心项210。继续“联系人”核心项210的示例,电子邮件应用程序可以通过添加扩展属性“电子邮件地址”和“业务电话号码”来扩展核心项210的属性。然后,核心项210可以被链接至零个、一个或多个其它项230。链接可以是外向链接240和/或内向链接250。外向链接240指的是以核心项210为源的核心项210与其它项230之间的耦合。内向链接250指的是以其它项230为源的核心项210与其它项230之间的耦合。外向链接240和/或内向链接250可以是类型化的。因此链接240、250提供项耦合的关系能力。例如,链接240、250可以是“朋友”类型的,该类型具有相关联属性“友谊日期”和“等级”。另外,链接240、250可以唯一地标识(例如,使用全局唯一标识符)项之间的耦合。核心项210还可以包括嵌入项260,此处有时将它们共同称为复合项。例如,“联系人”类型的核心项210可以包括含有图象(例如,照片)的嵌入项260。根据本发明的一方面,可以通过项级操作(例如,备份、还原、复制和/或导出)将复合项作为单个一致性单元来查看。核心项210可以含有片段270,片段是允许在项类型和项扩展中对大集合进行声明的实体类型。集合的元素是含有键的实体。这使得应用程序能够独立于持有项(owningitem)来访问和修改集合中的元素。不必为修改集合检索持有项。另外,系统可以跟踪嵌套范围内的每一元素的改变。核心项210可以由文件备份或可以具有FileStream(文件流)属性。文件后备项(filebackeditem)是其中从后备文件280中提升该项的一部分的项。扩展220、外向链接240、与内向链接250相关联的信息(例如,链接标识符)、嵌入项260、片段270和/或后备文件280可以被共同称为核心项210的“相关联实体”。当接收到串行化核心项210的请求时,如果存在核心项210及相关联实体,那么复制它们以保存核心项210的结构完整性。通过包含相关联实体,接收串行化流的系统(未示出)可以在核心项210及相关联实体的适当上下文中重新构造它们。示意图200示出了可以与串行化系统100一起使用的示例性项结构的元素。本领域的技术人员可以认识到,本发明不限于图中所示的项结构。可以使用用于实现本发明的任何合适的项结构,且所有这样的项结构都旨在落入所附权利要求书的范围内。参考图1和2,可以使用系统100来串行化(例如,用于向另一计算机系统传送)核心项210和核心项210的相关联实体(例如,扩展220、外向链接240、与内向链接250相关联的信息(例如,链接标识符)、嵌入项260和/或片段270)。标识组件110标识文件系统存储120内的核心项210,并向串行化组件130提供标识信息。标识组件110还标识与核心项210相关联的实体,并向串行化组件130提供关于该相关联实体的标识信息。串行化组件130可以为串行化过程中填充的头部(例如,临时性地)分配空间。在该示例中,串行化组件130执行以下动作1.为头部分配空间;2.串行化核心项210;3.如果存在片段270,对其串行化;4.如果存在外向链接240,对其串行化;5.如果存在内向链接标识符,使用其填充头部;6.如果存在扩展220,对其串行化;7.对每一嵌入项260,将特定嵌入项作为核心项210,递归地重复动作1至8;8.如果存在后备文件,对其串行化;9.串行化长度、头部偏移量及头部本身。转向图3,示出了根据本发明一方面的示例性串行化结构300。例如,可以由串行化组件130生成结构300,例如publicclassUdtSerialization{BinaryUdtSerializationbin;}表1结构300包括串行化长度320和头部偏移量330,例如publicclassBinaryUdtSerialization{//流中串行化的偏移量longserializationOffset;//串行化的长度longserializationLength;}表2表2中示出的类用于支持被用来解释用户定义类型(UDT)的二进制串行化的元数据。然后,结构300包括核心项部分340publicclassCoreItemUdtSerialization{//根项的项idSqlGuiditemId;//容器的项idSqlGuidcontainerId;//项的名字空间SqlStringnamespaceName;//它是文件后备项?boolisFileBacked;//如果内嵌后备文件,则为后备文件的偏移量longbackingFileOffset;//后备文件的长度longbackingFileLength;//存储文件后备项的属性System.IO.FileAttributesfatFileAttributes;//后备文件的创建时间DateTimefileCreationTime;//后备文件的最近写入时间DateTimefileLastWriteTime;//后备文件的最近访问时间DateTimefileLastAccessTime;//串行化中安全性描述符的偏移量longsdOffset;//串行化中安全性描述符的长度longsdLength;//项片段串行化开头的偏移量longitemFragmentOffset;//串行化中包含的项片段的数量longitemFragmentCount;}表3结构300还包括项片段350,例如publicclassItemFragmentHeaderUdtSerialization{//项片段的片段idprivateSqlGuidfragId;//片段的组idprivateSqlGuidsetId;}表4然后,结构300可以包括内向链接部分360,例如publicclassLinkHeaderUdtSerialization{SqlGuidsourceItemId;SqlGuidtargetItemId;SqlGuidlinkId;privateboolexcludesSchemaMetadata;}表5尽管链接对象一般含有诸如源和目标项标识符等信息,然而在目标处链接类型的模式缺失而链接不能被反串行化的情况下,该信息在LinkHeader(链接头部)中重复。继续,结构300可以包括项扩展部分370publicclassItemExtensionHeaderUdtSerialization{}表6结构300可以包括嵌入项380publicclassEmbeddedItem{//嵌入项的头部ItemHeaderitemHeader;}表7其中publicclassItemHeader{//核心项头部CoreItemcoreItem;//包含该项所有外向链接的链接头部的列表ArrayListoutLinks;//该项的扩展的扩展头部的列表ArrayListextensions;//嵌入项头部的列表ArrayListembeddedItems;//该项的内向链接的id列表ArrayListinLinkIds;//关于后备文件的信息privateBackingFileHeaderbackingFileHeader;//串行化是否排除模式元数据boolexcludesSchemaMetadata;//串行化中的安全性描述符的偏移量longsdOffset;//串行化中的安全性描述符的长度longsdLength;}表8然后,结构300可以包括后备文件部分390publicclassBackingFileHeader{//如果内嵌后备文件,则为后备文件的偏移量privatelongbackingFileOffset;//后备文件的长度privatelongbackingFileLength;//存储文件后备项的属性privateSystem.IO.FileAttributesfatFileAttributes;//后备文件的创建时间privateDateTimefileCreationTime;//后备文件的最近写入时间privateDateTimefileLastWriteTime;//后备文件的最近访问时间privateDateTimefileLastAccessTime;}表9最后,结构300可以包括头部部分394。头部部分394可以包括与核心项及相关联实体相关联的信息。头部部分394可以便于对核心项及相关联实体的访问(例如,允许读程序仅解释/解析它所感兴趣的部分)。接着参考图4,示出了根据本发明的一方面的串行化系统400。串行化系统400包括如上所述的标识组件110和串行化组件130。系统400还包括应用程序接口(API)410。API410便于系统400与应用程序420之间的通信。例如,API410可以便于将项及其相关联实体从一个位置复制、移动和/或传送至另一位置(例如,分离的计算机系统和/或可移动介质)。因此,可以将API用于项级操作,诸如导出、备份、还原、复制等。在一个示例中,应用程序420可以通过向API410提供串行化信息(例如,标志)来选择性地包括项的全部或部分。API410可以在文件系统级和/或存储过程级展示。以下讨论示例性API410SerializeItem(串行化项)APISerializeItemAPI生成包括以下组件(如果存在)的项串行化●核心项●外向链接(被串行化的项为源项的链接)以及内向链接(被串行化的项为目标项的链接)的链接标识符●复合项中的项●扩展●项片段●实体的本地创建时间和修改时间。例如,对SerializeItemAPI的调用可以是以下形式[System.Storage.Serialization].SerializeItem(@itemiduniqueidentifier,@dataoptionsint)returnsvarbinary(max)其中itemid(项id)是将被串行化的项的标识符;dataoptions指的是串行化数据选项——如下所述用于定制串行化内容的选项;并且,该API返回字节数组形式的项的串行化。SerializeItemToFile(将项串行化至文件)万一项相当大,在存储器中对项串行化并将串行化返回给客户机应用程序可能是低效的。对这样的情形,可以使用将串行化直接写至由应用程序指定的文件的SerializeItemToFileAPI。这可以限制在客户机应用程序和服务器端双方由串行化所消耗的存储器。另外,API可以导向更好的性能,因为需要被从服务器发送至客户机应用程序的字节数量要少得多。例如,对SerializeItemToFile的调用可以是以下形式.SerializeItemToFile(@itemiduniqueidentifier,@dataoptionsint,@filenamenvarchar(1024))returnsbigint其中itemid是将被串行化的项的标识符;dataoptions指的是串行化数据选项——如下所述用于定制串行化内容的选项;filename(文件名)是向其串行化对象的文件的名称;并且,API返回写入至文件的字节数。SerializationDataOptions(串行化数据选项)选项值允许串行化函数满足各种顾客情形的需求。这些选项可以被用来选取关于应该作为串行化的一部分被包括的项的数据/元数据元素。这些选项可以影响串行化的内容。在该示例中,选项的值可以被指定为以下的OR(或)组合●公共用例中的零个或一个●各单个选项中的零个、一个或多个选项。单个选项这些选项为单个情形定义项边界。例如●INCLUDE_EXTENSIONS0x2指定扩展是否应被包含在该串行化中。●INCLUDE_OUTGOING_LINKS0x4指定输出链接是否应被包含在该串行化中。●INCLUDE_EMBEDDED0x8指定复合项中的所有的项是否应被包含在该串行化中。●INCLUDE_SECURITY_DESCRIPTOR0x10指定项上的显式访问控制列表(ACL)是否应被包含。●INCLUDE_SYNC_METADATA0x80包含非授权还原所需的同步元数据。●INCLUDE_SCHEMA_METADATA0x100指定反串行化该项所需的模式元数据是否必须被包含在该串行化中。万一要串行化大量项,那么应用程序可以选择将其与单个项串行化分离地备份。●INLINE_BACKING_FILE0x200指定后备文件是否内嵌在串行化中还是仅有文件的UNC路径作为串行化的一部分。这也包括后备文件的属性(隐藏、只读等)和时戳。使用这些示例性选项的有效串行化数据选项的示例包括SERIALIZE_FOR_COPY|INCLUDE_IDs该选项产生项的串行化,为复制定制,也包含id。SERIALIZE_FOR_BACKUP|INCLUDE_IDs这是有效选项,但是指定该选项,SERIALIZE_FOR_BACKUP|INCLUDE_IDs自动开启且分离地指定它是冗余的。INCLUDE_IDs|INCLUDE_OUTGOING_LINKS这产生在串行化中保留项id的核心项及其扩展。在该示例中,不指定任何公共用例是有效的。使用这些示例性选项的无效串行化数据选项的示例包括SERIALIZE_FOR_COPY|SERIALIZE_FOR_BACKUP在该示例中指定一个以上默认值是无效的。SERIALIZE_FOR_COPY&!INCLUDE_EXTENSIONS在该示例中,不允许‘and(与)’组合。为了达到以上目的,必须使用如下的显式的单个选项或其组合来指定选项INCLUDE_OUTGOING_LINKS|INCLUDE_EMBEDDED|INLINE_FILESTREAM_ATTRIBUTES|INCLUDE_SCHEMA_METADATA公共用例这些选项为大多数公共使用情形定义了项界限。例如●SERIALIZE_FOR_COPY0x10000000当选中该选项时,开启以下选项。○INCLUDE_EXTENSIONS,○INCLUDE_OUTGOING_LINKS,○INCLUDE_EMBEDDED,○INCLUDE_SECURITY_DESCRIPTOR,○INLINE_FILESTREAM_ATTRIBUTESand○INCLUDE_SCHEMA_METADATA●SERIALIZE_FOR_BACKUP0x20000000当选中该选项时,开启以下选项。○INCLUDE_EXTENSIONS,○INCLUDE_OUTGOING_LINKS,○INCLUDE_EMBEDDED,○INLINE_FILESTREAM_ATTRIBUTES,○INCLUDE_SECURITY_DESCRIPTOR,○INCLUDE_SCHEMA_METADATA○INCLUDE_IDsand○INCLUDE_SYNC_METADATA转向图5,示出了根据本发明的一方面的串行化环境500。应用程序420向串行化系统400提供与将被串行化的项相关联的信息,例如ItemID(项id)。之后,串行化系统400从文件存储系统元数据510中获取关于ItemID的类型信息。使用ItemID及类型信息,串行化组件400向文件系统视图530查询(例如,递归地)上述与将被串行化的项相关联的信息(例如,项及相关联的实体)。在一个示例中,串行化组件130不支持对项片段的随机访问。在该示例中,可以使用与头部的起始偏移量和每一片段前面的长度字段来顺序地(例如,以链表的方式)访问项片段。复合项中的项当选中INCLUDE_EMBEDDED选项时,系统400递归地走查复合项中的各个项并对其串行化。例如,系统400可以执行多个查询来走查该递归结构并串行化每一项。得到的串行化具有递归结构,其中嵌入项串行化被包含在其父串行化中。在一个示例中,复合项中的每一项可以具有不同的安全性描述符。因此,串行化API的调用者不具有对复合项中的所有项的访问是可能的。在该示例中,在其中用户不具有对所有项的访问的情形中,调用者不能访问的项将不被串行化。后备文件在该示例中,后备文件或者可以被内嵌至串行化中,或者由调用者分开复制(例如,基于串行化选项)。后备文件内嵌当应用程序请求在串行化中包含文件后备项时,可以从文件存储系统120中读取后备文件。除文件以外,属性、创建、最近访问和/或修改时间也可以被包含在串行化头部中。例如,当为备份(例如,需要在反串行化之后将时戳还原至其原始值)而对项串行化时可以使用该信息。不内嵌后备文件在该情形中,应用程序例如通过在调用串行化API时不设置INLINE_BACKING_FILE选项,不请求在串行化中包含文件后备项。在该示例中,串行化API可以将文件名嵌入头部中,而非在串行化中包含文件内容。从而,应用程序可以读取该文件名并直接使用文件存储系统API来处理后备文件的内容。然而,在该情况下,同样也可以在串行化头部中捕捉到文件属性以及创建、最近访问和修改时戳。例如,该信息可以是何时当为备份(例如,要求在反串行化之后将时戳还原至其原始值)对项进行串行化。模式元数据在该示例中,随每一实体串行化捕捉模式元数据,因为它包含对文件系统存储120唯一的typeId(类型id)。程序集名称和版本映射的typeId是反串行化用户定义类型串行化所需的模式元数据。例如,可以存在与每一实体相关联的模式元数据(例如,项、链接、扩展和/或片段),且可以随各个实体串行化包含它。为了获取该信息,串行化系统400可以查询系统元数据520以获取全限定类型名称。例如,给定TypeId,GetNameFromTypeId(从类型id中获得名称)返回全限定类型名称,作为仅一行两列分别包含SchemaName(模式名称)和TypeName(类型名称)的表。可以将来自文件系统存储120的各个项/链接/扩展/片段表的TypeId用作函数的输入,以获取模式名称和类型名称。这还可以与sys.assemblies表进一步结合来获取全限定类型名称。一般而言,TypeId跨文件系统存储130(例如,数据库)不是唯一的,然而全限定类型名称是唯一的。对存储内复制(例如,在源和目标处类型id相同),可以排除模式元数据。安全性如前所述,每一项可以具有与其相关联的安全性描述符,该描述符标识可以访问该项的用户和/或不能访问它们的用户。继续关于图5讨论的示例,标识了示例性信任边界540。在该示例中,环境500可以依赖于文件系统授权来确保用户具有连接至文件系统存储120的许可。特定串行化或反串行化API的调用者一般在调用API之前已经与文件系统存储120建立了连接。然后转向图6,示出了根据本发明的一方面的反串行化系统600。系统600可以被用来反串行化例如由系统100和/或系统400生成的项及其相关联的实体。系统600可以使用头部来获取对项及相关联实体的随机访问(例如,可以仅解释/解析其所感兴趣的部分)。系统600可以展示便于对项及其相关联实体进行反串行化的应用程序编程接口(API)610。API610可以向反串行化组件620提供例如从应用程序630接收的已串行化项。反串行化组件620重新创建项的结构并将其存储在文件系统存储640中。当从应用程序630中接收到反串行化项的请求之后,API610将该已串行化的项提供给反串行化组件620,反串行化组件620可以使用如上所述的头部偏移量来读取头部(例如,至存储器),并在反串行化过程中使用该头部。在一个示例中,反串行化组件620然后可以1.反串行化核心项2.反串行化项片段3.反串行化外向链接4.反串行化扩展5.例如按照递归的方式自顶向下遍历树来反串行化嵌入在复合项容器中的项。6.反串行化后备文件经反串行化的项及相关联实体被存储在文件系统存储640中。链接修正在一个示例中,在反串行化过程中,系统600确保一旦项被反串行化之后,存在于串行化中的项的所有关系继续存在。而且,因为内向链接信息被串行化了,串行化也将修正内向链接至被反串行化的项。这确保了当反串行化已串行化的项后得到的是(例如,完全)相同的项。例如,修正工作的范围可以是给定复制操作中的所有项。如下所述,串行化API的用户可以通过调用两个助手APIBeginDeserializationBatch(开始反串行化批处理)和EndDeserializationBatch(结束反串行化批处理)来创建批处理范围。在该范围内反串行化的任何项将使得其链接修正至该范围内的其他项。例如,可以在项被反串行化时,使用临时表来跟踪该项的关系的ID。该临时表然后将旧的ID映射至新的ID,并串行化,然后修复链接的目标ID和源ID。在该示例中,可以修复(批处理量范围内的)链接和包含关系。例如,这可以被实现为DeserializeItem的额外标志。然而,在一个示例中,串行化API的消费者被要求显式地规定批处理范围的开始和结束。APIAPI610便于系统600与应用程序630之间的通信。例如,API410可以便于已串行化项的反串行化。可以在文件系统级和/或存储过程级展示API610。以下讨论示例性API610DeserializeItem(反串行化项)APIDeserializeItemAPI反串行化项,并将它置于其id被指定为containerid(容器id)的容器中。如果传递的名字空间和容器id均为空,那么可以从串行化中取得它们的值。存储过程在项被串行化时所处的同一容器中反串行化该项。例如,在诸如将整棵树(例如,文件夹和子文件夹)从源复制至目的地,同时保留项id的情形中可以如此期望。在该示例中,如果串行化不包含项id,容器id将不能被传递为空(例如,这样做将导致错误)。例如[System.Storage.Serialization].DeserializeItem(@serializationvarbinary(max),@containerIduniqueidentifier,@namespacenamenvarchar(255),@optionsint,@itemiduniqueidentifieroutput)@fileinfolistFileInfoListoutput其中serialization指的是已串行化的项(例如,作为早先串行化结果而产生的);cotainerId指的是包含新项的容器的ItemId;namespacename(名字空间名称)指的是被反串行化的项的名字空间的名称;options(选项)指的是管理反串行化过程的行为的选项(以下描述);itemid指的是新项的ItemId;而fileinfolist是包含在该项中的文件名、项id和文件大小的列表。例如ClassFileInfoListArrayList;//它将包含以下实例ClassFileInfo{SqlGuiditemId;SqlStringrelativePath;SqlBigintsize;}使用重写现有项来反串行化(DeserializeItemReplace)该API610反串行化存储中的现有项,并使用给定串行化的内容对其重写。在该示例中,当重写文件后备项时,截去后备文件。如果串行化不含有内嵌的文件,那么该操作导致长度为零的后备文件。而且,在该示例中,仅当将同一项还原至之前的状态时,才能使用该API610。例如[System.Storage.Serialization].DeserializeItemReplace(@serializationvarbinary(max),@targetitemiduniqueidentifier,@optionsint)其中serialization指的是已串行化的项(例如,作为早先串行化结果而产生的);targetitemid(目标项id)指的是被替换的项的ItemId;而options指的是管理反串行化过程的行为的选项(以下描述)。从文件中反串行化项(DeserializeItemFromFile)可以提供该API610来允许从文件(例如,由系统100和/或系统400产生的)中反串行化大型项。例如,文件可以由如上所述的SerializeItemToFileAPI来产生,和/或通过调用如上所述的SerializeItemAPI并之后将项串行化写入至文件来产生。在该示例中,如果将名字空间名称和容器id均传递为空,那么它们的值可以从串行化中取得。例如[System.Storage.Serialization].DeserializeItemFromFile(@filenamenvarchar(1024),@containerIduniqueidentifier,@namespacenamenvarchar(255),@optionsint,@itemiduniqueidentifieroutput,@fileinfolistFileInfoListoutput其中,filename指的是含有将被反串行化的项的串行化的文件的名称;containerId指的是包含新项的容器的ItemId;namespacename指的是被反串行化的项的名字空间的名称;options指的是新项的ItemId;而fileinfolist是该项中包含的文件名、项id和文件大小的列表。例如ClassFileInfoListArrayList;//它将包含以下实例ClassFileInfo{SqlGuiditemId;SqlStringrelativePath;SqlBigintsize;}使用从文件重写现有项来反串行化(DeserializeItemReplaceFromFile)使用从文件重写现有项反串行化API610使用包含在所指定的文件(例如,由上述SerializeItemToFileAPI创建,和/或通过调用SerializeItemAPI并进行项串行化随后写入文件来创建)中给定项串行化的内容来重写文件系统存储640中的现有项。在该实例中,当重写文件后备项时,截去该后备文件。如果串行化不含有内嵌的文件,那么该操作导致长度为零的后备文件。在该示例中,仅当将相同的项还原至之前的状态时,才能使用DeserializeItemReplaceFromFile。例如[System.Storage.Serialization].DeserializeItemReplaceFromFile(@filenamenvarchar(1024),@fileoffsetbigint,@targetitemiduniqueidentifier,@optionsint,@bytesreadbigintoutput其中,filename指的是含有将被反串行化的项的串行化的文件的名称;targetitemid指的是被替换的Item的ItemId;options指的是管理反串行化进程的行为的选项(以下描述);而bytesread(字节读取)返回读取的字节数(例如,以便于跳至下一偏移量)。BeginDeserializationBatch和EndDeserializationBatch这些助手函数可以彼此结合及与Link_Fix_Up反串行化选项(以下描述)结合来使用。调用BeginDeserializationBatch(开始反串行化批处理)启动反串行化批处理范围。在该示例中,在该范围中串行化的所有项将更正它们的链接,使得它们能继续工作。当所有的项都被反串行化之后,然后调用EndDeserializationBatch(结束反串行化批处理)来结束该范围,并清空由该操作使用的临时表。例如,项A链接至项B,而项B链接至项C。而且,这些项被反串行化至新的存储。在该示例中,客户机应用程序进行以下调用BeginDeserializationBatch()(createtemptabletotrackallthelinks)DeserializeallitemswithLinkFixupflagEndDeSerializationBatch()即使在该新的存储中重新创建了项,且它们具有新的ItemID,但是由于修正标志,它们仍旧可以被正确地链接在一起。反串行化选项示例性的反串行化选项包括●RETAIN_ITEM_ID0x1保留与已串行化项相同的itemId。这仅当ItemID不为空时可用。●RESTORE_SECURITY_DESCRIPTOR0x2保留与已串行化项相同的显式访问控制列表(ACL)。●RESTORE_TIME_STAMP0x4还原本地创建时间和修改时间(例如,可用于复制和/或还原)。●RESTORE_SYNC_METADATA0x8为项还原ChangeInformation(改变信息)、SyncMetadata(同步元数据)。在复件/映射/冲突项的情况中,仅当指定该选项才还原。●LINK_FIX_UP0x10可以结合两个助手APIBeginSerializationBatch和EndSerializationBatch来使用Link_Fix_Up选项以确保保持所有项链接。在一个示例中,如果在批处理范围之外使用Link_Fix_Up,将导致失败。在反串行化中使用用户定义类型可以由反串行化组件620来执行用户定义类型(UDT)的重构,以便(1)验证该串行化是否为有效的串行化;和(2)验证反串行化项所需的类型是否存在于系统中;和/或(3)触发确认约束。在该示例中,对来自串行化的UDT的重构可以在核心项的反串行化之前执行。接着参考图7,示出了根据本发明的一方面的反串行化环境700。环境700包括反串行化系统600,它通过基本更新(baseupdate)API720与文件系统存储640接口。还标识了示例性信任边界730。如上所述,特定反串行化API的调用者一般在调用API之前已经与文件系统存储640建立了连接。例如,应用程序630可以向反串行化系统600提供项反串行化。如前所述,反串行化系统600可以从系统元数据710中获取关于用户定义类型的信息。通过基本更新API720,反串行化系统600可以试图存储经反串行化的核心项及相关联实体。基本更新API720可以包括,例如CreateItem(创建项)反串行化系统600可以使用该基本更新API720来在文件系统存储640中创建反串行化的项。例如,可以在不经重写而创建项时使用该基本更新API720。SetItemSecurity(设置项安全性)该基本更新API720可以使用来设置已被串行化的项的安全性描述符。例如,当设置安全性描述符时,可以使用以下策略●当反串行化系统600没有指定还原语义时,SetItemSecurity用来仅设置访问控制列表。●当指定了还原语义时,SetItemSecurity可以用来设置访问控制列表和组及所有者。ReplaceItem(替换项)反串行化系统600可以调用该基本更新API720来使用经反串行化的项来重写文件系统存储640中现有的项。例如,可以在使用重写创建项时使用该基本更新API720。MoveItem(移动项)该基本更新API720可以用于移动将被替换的项,使得它具有与当它被串行化时相同的容器和相同的名字空间名称。CreateLink(创建链接)反串行化系统600可以使用该基本更新API720来反串行化文件系统存储640中的项的外向链接。CreateExtension(创建扩展)该基本更新API720可以用来反串行化文件系统存储640中的项的扩展。CreateItemFragment(创建项片段)反串行化系统600可以使用该基本更新API720来反串行化文件系统存储640中的项的片段。UpdateLink(更新链接)如下所述,该基本更新API720可以由反串行化系统600使用来更新作为项的内向链接的链接的目标项id。替换移动过的项在反串行化过程中使用其之前的副本来替换项在还原过程中是常见的。值得注意的是,已被还原的项可能在它被串行化(例如,备份)和反串行化(例如,还原)的时间之间移动。移动是指示下述之一的普通操作a)改变父容器,b)改变名字空间名称,和/或c)改变名字空间名称和父容器两者。在该示例中,当项被还原时,替换操作不能改变名字空间名称或containerid。从而,为了将项还原至其原始位置,使用MoveItem来具有相同的容器和相同的名字空间名称(如果它们均没有改变),然后执行替换。替换复合项在该示例中,当在复合项上调用DeserializeItemReplace时(例如,使用其之前的副本来替换复合项),发生以下情况1)根项被移动至其原始位置,它的名字空间名称被还原至其旧值,并被串行化中的项替换;2)自从复合项树串行化(例如,备份)以来向其添加的项被删除;3)使用CreateItem将自从复合项被串行化以来从中删除的项创建为反串行化过程的一部分;以及,4)使用ReplaceItem来替换自从最近的串行化以来没有被删除的项。处理正被反串行化的项的内向链接在一个示例中,在还原操作过程中(例如,在环境700保留项id时),可以使用以下来修补向内至该项的链接的目标项id对每一内向链接ida.检查具有该链接id的链接是否在存储中存在。如果它存在,那么继续下一步,否则跳过下一步b.使用UpdateLinkAPI720来更新这些链接的目标项id为经反串行化的项的id。c.对所有内向链接id重复以上两步。反串行化文件后备项文件在串行化中内嵌在一个示例中,当文件在串行化中内嵌时,头部可以携带以下信息文件后备项的项id(从中可以推断出至文件将被写入的位置的路径),以及包含后备文件的串行化的部分。这可以用来使用基本更新API720来将一个或多个文件写入指定的位置。文件在串行化中不内嵌在该示例中,当文件在串行化中不内嵌时,使用基本更新API720来将后备文件复制至目标位置是调用者的职责。可以理解,按照此处对术语计算机组件的定义,系统100、文件系统存储120、系统400、API410、应用程序420、系统500、文件存储系统元数据510、系统元数据520、文件系统视图530、环境600、API610、反串行化组件620、应用程序630、文件系统存储640、环境700、系统元数据710和/或基本更新API720都可以是计算机组件。简要地参考图8-11,示出了根据本发明可以实现的方法。尽管为说明的简单起见,该方法作为一连串框来示出和描述,但是可以理解和领会,本发明不受框的顺序限制,因为根据本发明,某些框可以按与此处示出和描述的不同顺序和/或与其它框同时发生。而且,不是所有示出的框对实现根据本发明的方法都是必需的。可以在诸如程序模块等由一台或多台计算机运行的计算机可执行指令的通用语境中描述本发明。一般而言,程序模块包括例程、程序、对象、数据结构等,它们执行特定的任务或实现特定的抽象数据类型。通常,在各个实施例中,程序模块的功能可以按照所期望的方式结合或分布。参考图8和9,示出了根据本发明的一方面便于串行化项的方法800。在804处,(例如,从应用程序)接收到串行化项的请求。在808处,为头部分配存储器。在812处,串行化核心项。在816处,如果存在任何项片段,则对其串行化。然后,在820处,如果存在外向链接,则对其串行化。在824处,如果存在内向链接标识符,则将其填充至头部。在828处,如果存在扩展,则对其串行化。在832处,如果存在嵌入项,则对其串行化。在836处,如果存在后备文件,则对其串行化。在840处,将串行化长度、头部偏移量和头部写入串行化。在844处,向请求者(例如,请求应用程序)提供关于串行化的信息。例如,可以将串行化本身提供给请求应用程序。或者,可以向请求应用程序提供指向串行化的指针和/或串行化的文件名。接着,转向图10和11,示出了根据本发明的一方面便于反串行化项的方法1000。在1004处,接收到反串行化项的请求。在1008处,头部偏移量被用于将头部读入存储器。在1012处,反串行化核心项。在1016处,如果存在项片段,则对其反串行化。在1020处,如果存在外向链接,则对其反串行化。在1024处,如果存在扩展,则对其反串行化。在1028处,如果存在嵌入项,则对其反串行化。在1036处,如果存在后备文件,则对其反串行化。被反串行化的项及相关联实体可以被存储在文件存储系统中。为了提供本发明的各方面的其他语境,图12及以下讨论旨在提供可在其中实现本发明各方面的合适的操作环境1210的简要概括的描述。尽管在诸如程序模块等由一台或多台计算机执行的计算机可执行指令的通用语境中描述了本发明,但是本领域的技术人员可以认识到,本发明也可以结合其它程序模块和/或作为软硬件的组合来实现。然而,一般而言,程序模块包括例程、程序、对象、组件、数据结构等,它们执行特定的任务或实现特定的抽象数据类型。操作环境1210只是合适的操作环境的一个示例,并不旨在对本发明的使用范围或功能提出任何限制。适合在本发明中使用的其它公知的计算系统、环境和/或配置可以包括,但不限于,个人计算机、手持式或膝上型设备、多处理器系统、基于微处理器的系统、可编程消费者电子产品、网络PC、小型机、大型机、包含上述系统或设备中的分布式计算机环境等。参考图12,用于实现本发明各方面的示例性环境1210包括计算机1212。计算机1212包括处理单元1214、系统存储器1216和系统总线1218。系统总线1218将包括但不限于系统存储器1216的系统组件耦合至处理单元1214。处理单元1214可以是任何各种可用的处理器。也可以使用双微处理器和其它多处理器体系结构作为处理单元1214。系统总线1218可以是若干类型的总线结构中的任一种,包括存储器总线或存储器控制器、外围总线或外部总线,和/或使用各种可用的总线体系结构中的任一种的局部总线,可用的总线体系结构包括,但不限于,8位总线、工业标准体系结构(ISA)、微通道体系结构(MCA)、扩展的ISA(EISA)、智能驱动器电子接口(IDE)、VESA局部总线(VLB)、外围部件互连(PCI)、通用串行总线(USB)、高级图形接口(AGP)、个人计算机存储卡国际协会总线(PCMCIA)以及小型计算机系统接口(SCSI)。系统存储器1216包括易失性存储器1220和非易失性存储器1222。基本输入/输出系统(BIOS)包含有助于诸如启动时在计算机1212中元件之间传递信息的基本例程,它通常存储在非易失性存储器1222中。作为说明,而非限制,非易失性存储器1222可以包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除ROM(EEPROM)或闪存。易失性存储器1220包括用作外部高速缓存的随机存取存储器(RAM)。作为说明,而非限制,RAM以多种形式可用,诸如同步RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双倍数据速率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路DRAM(SLDRAM)以及直接RambusRAM(DRRAM)。计算机1212也包括可移动/不可以移动、易失性/非易失性计算机存储介质。例如,图12示出磁盘存储1224。磁盘存储1224包括,但不限于,如磁盘驱动器、软盘驱动器、磁带驱动器、Jaz驱动器、Zip驱动器、Ls-100驱动器、闪存卡或记忆棒的设备。另外,磁盘存储1224可以包括独立或与其它存储介质结合的存储介质,包括但不限于,诸如光盘ROM设备(CD-ROM)、CD可记录驱动器(CD-R驱动器)、CD可重写驱动器(CD-RW驱动器)或数字多功能盘ROM驱动器(DVD-ROM)等的光盘驱动器。为了便于将磁盘存储设备1224连接至系统总线1218,一般使用诸如接口1226等可移动或不可移动接口。可以理解,图12描述了作为用户和在合适的操作环境1210中描述的基本计算机资源之间的中介的软件。这样的软件包括操作系统1228。可被存储在磁盘存储1224上的操作系统1228用来控制和分配计算机系统1212的资源。系统应用程序1230利用了操作系统1228通过存储在系统存储器1216或者磁盘存储1214上的程序模块1232和程序数据1234执行的资源管理。可以理解,本发明可以使用各种操作系统或操作系统的组合来实现。用户通过输入设备1236向计算机1212输入命令或信息。输入设备1236包括,但不限于,诸如鼠标、跟踪球、指示笔等定点设备、触摸垫、键盘、麦克风、操纵杆、游戏垫、圆盘式卫星天线、扫描仪、TV调谐器卡、数码相机、数码摄像机、网络摄像头等。这些和其它输入设备经由接口端口1238通过系统总线1218连接至处理单元1214。接口端口1238包括,例如串行端口、并行端口、游戏端口和通用串行总线(USB)。输出设备1240使用某些与输入设备1236相同类型的端口。从而,例如,USB端口可以用于向计算机1212提供输入,并向输出设备1240输出来自计算机1212的信息。提供输出适配器1242来示出,存在类似监视器、扬声器和打印机以及其它需要专用适配器的输出设备1240的某些输出设备1240。作为说明而非限制,输出适配器1242包括提供输出设备1240和系统总线1218之间的连接手段的显卡和声卡。应该注意,诸如远程计算机1244等其它设备和/或设备系统同时提供输入和输出能力两者。计算机1212可使用至一台或多台远程计算机,诸如远程计算机1244的逻辑连接在网络化环境中操作。远程计算机1244可以是个人计算机、服务器、路由器、网络PC、工作站、基于微处理器的装置、对等设备或其它常见网络节点等,且通常包括上文相对于计算机1212描述的许多或所有元件。为简洁起见,对于远程计算机1244仅示出存储器存储设备1246。远程计算机1244通过网络接口1248被逻辑连接至计算机1212,并且然后通过通信连接1250被物理地连接。网络接口1248包括诸如局域网(LAN)和广域网(WAN)的通信网络。LAN技术包括光纤分布式数据接口(FDDI)、铜线分布式数据接口(CDDI)、以太网/IEEE802.3、令牌环/IEEE802.5等。WAN技术包括,但不限于,点对点链路、类似综合业务数字网(ISDN)及其变体的电路交换网络、分组交换网络和数字用户线(DSL)。通信连接1250指的是用来将网络接口1248连接至总线1218的硬件/软件。尽管为说明清楚,将通信连接1250示为位于计算机1212内,然而通信连接1250也可以在计算机1212外部。仅为示例性的目的,连接至网络接口1248所必需的硬件/软件包括内部和外部技术,诸如包括常规电话级调制解调器、线缆调制解调器和DSL调制解调器等的调制解调器、ISDN适配器以及以太网卡。以上描述的包括本发明的示例。当然,不可能为描述本发明的目的而描述每个可想象的组件或方法的组合,但是本领域的普通技术人员可以认识到,本发明的众多其它组合和排列是可能的。从而,本发明旨在包括落入所附权利要求书精神和范围内的所有这样的变更、修改和变化。而且,就或者在详细描述或者在权利要求书中使用的术语“包括”而言,当被用作权利要求书中的过渡词时,这样的术语旨在类似于解释术语“包含”的方式是包含性的。权利要求1.一种串行化系统,包括标识与项相关联的实体的标识组件;以及串行化所述项、所述相关联实体和头部的串行化组件,所述头部提供与所述项及相关联实体相关联的信息。2.如权利要求1所述的系统,其特征在于,所述相关联实体包括外向链接、内向链接、嵌入项、项片段和后备文件中的至少一个。3.如权利要求1所述的系统,其特征在于,基于请求启动对所述项及相关联实体的串行化。4.如权利要求3所述的系统,其特征在于,对所述相关联实体的标识是至少部分地基于与所述请求相关联的上下文相关联的安全性信息。5.如权利要求4所述的系统,其特征在于,对所述相关联实体的标识还基于与所述相关联实体相关联的访问控制列表。6.如权利要求1所述的系统,其特征在于,所述头部便于对所述项及相关联实体的随机访问。7.如权利要求1所述的系统,其特征在于,还包括便于所述系统和与所述项的串行化相关联的应用程序之间的通信的应用程序编程接口。8.如权利要求7所述的系统,其特征在于,所述应用程序编程接口便于对项及相关联实体的导出、备份、还原和复制中的至少一种。9.如权利要求7所述的系统,其特征在于,所述应用程序编程接口接收与串行化选项相关联的信息,所述串行化选项被用来选取多个相关联实体中的哪一个来与所述项一起串行化。10.如权利要求7所述的系统,其特征在于,所述应用程序编程接口在文件系统级上展示。11.如权利要求7所述的系统,其特征在于,所述应用程序编程接口在存储过程级上展示。12.如权利要求7所述的系统,其特征在于,所述应用程序编程接口以字节数组形式返回所述串行化。13.如权利要求7所述的系统,其特征在于,所述应用程序编程接口返回与所述串行化相关联的指针或文件名。14.如权利要求1所述的系统,其特征在于,所述相关联实体包含嵌入项,所述系统还递归地串行化所述嵌入项。15.一种接收如权利要求1所述的系统生成的串行化的反串行化系统。16.一种便于串行化项的方法,包括串行化所述项;标识与所述项相关联的至少一个实体;以及串行化所述相关联实体。17.如权利要求16所述的方法,其特征在于,包括至少以下其中之一接收串行化所述项的请求;串行化头部,所述头部包含与所述项及相关联实体相关联的信息;串行化串行化长度和头部偏移量。18.如权利要求16所述的方法,其特征在于,所述相关联实体包括外向链接、内向链接、嵌入项、扩展、项片段、安全性信息和后备文件的至少一个。19.一种其上存储用于实现如权利要求16所述的方法的计算机可执行指令的计算机可读介质。20.一种在两台或多台计算机组件之间传输的、便于项的串行化传送的数据包,所述数据包包括串行化长度字段;头部偏移量字段;核心项字段;包含至少一个相关联实体的字段;以及,提供与项及相关联实体相关联信息的头部字段。全文摘要提供了用于对文件系统项及相关联实体进行串行化和/或反串行化的系统和方法。文件系统“项”包括可以包含属性的核心类。项可以是简单或者是复合的(例如,包含嵌入其中的其它项)。与项相关联的可以是诸如片段、与其它项的链接和/或扩展等实体。通过串行化,如果存在项及相关联实体的一致的副本,可以对其进行捕捉(例如,用于传送项并在目的地系统上重构该项)。串行化系统包括标识与项相关联实体的标识组件,以及串行化项及相关联实体的串行化组件。串行化组件还可以串行化包含与项及相关联实体相关联的信息的头部。头部可以便于对项及相关联实体的随机访问(例如,允许读程序仅解释/解析其所感兴趣的部分)。串行化系统可以展示便于将项及其相关联实体从一个位置复制、移动和/或传送至另一位置的应用程序编程接口(API)。文档编号G06F17/30GK1825314SQ20061000467公开日2006年8月30日申请日期2006年1月24日优先权日2005年2月24日发明者H·R·科达瓦拉,M·J·斯利曼,R·D·达曼卡,V·卡瑟瑞亚申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1