CN100517224C - 对象的串行化存储和恢复的系统和方法 - Google Patents
对象的串行化存储和恢复的系统和方法 Download PDFInfo
- Publication number
- CN100517224C CN100517224C CNB2007101108954A CN200710110895A CN100517224C CN 100517224 C CN100517224 C CN 100517224C CN B2007101108954 A CNB2007101108954 A CN B2007101108954A CN 200710110895 A CN200710110895 A CN 200710110895A CN 100517224 C CN100517224 C CN 100517224C
- Authority
- CN
- China
- Prior art keywords
- serialization
- object type
- wrapper
- type
- storage
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开一种对象的串行化存储和恢复的系统和方法,涉及计算机面向对象编程处理技术,为解决现有的待串行化对象类型不一致以及串行化粒度不可控的问题而发明,本发明包括:串行化包装器生成模块,用于为每个待串行化对象类型分别生成相应的串行化包装器对象类型;永久化管理器,用于为所述串行化包装器生成模块生成的各个串行化包装器对象类型分别分配相应的对象标识,并为各个串行化包装器对象类型所对应的待串行化对象类型分配相应的串行化数据流;永久化代理器,用于在所述永久化管理器分配的串行化数据流中维持待串行化对象类型之间的引用关系。本发明可应用于.NET的开发平台以及所有编译性的开发平台。
Description
技术领域
本发明涉及计算机面向对象编程处理技术,特别涉及对象的串行化存储和恢复的系统和方法。
背景技术
在计算机面向对象的编程技术领域中,串行化(serialization,也称序列化)是将对象从一种表示或者格式向另一种表示或者格式的转换。串行化一般意味着双向过程:即将对象从初始表示转换为其它表示,在需要时再将其它表示转换回初始表示。也可以将对象从其它表示转换为初始表示的过程称为反串行化。反串行化只是相对于串行化过程来定义的,反串行化和串行化均可统一被称为串行化。串行化主要用于数据的存储和恢复(也可认为是保存和读取,即I/O)过程中。
目前,在面向对象的编程技术领域中,串行化用于将某个对象的状态以及该对象与其所指向的其它对象所构成的结构图全部写到一个数据流中(比如文件、网络等),在该数据流中不仅保留每个对象本身的数据,也保留了每个对象之间的引用关系,这样就保证了该对象结构图写入数据流之后,在另一时刻,该对象结构图能够完整地被重新恢复出来。例如,存储器内(in-memory)对象或者活(live)对象(可被访问且可被使用的对象)可以串行化为适合于永久存储或者通过网络发送的永久或瞬时对象。存储器内对象或者活对象一旦被存储或者发送之后,对象的这种永久表示或者瞬时表示可以反串行化回存储器内对象或者活对象。
存储器内对象或者活对象通常不是孤立的,而是相互联系的,构成图状的引用关系,被称为对象图形(object graph),如图1所示:obj1(对象1)直接引用obj3(对象3)和obj4(对象4);而obj3(对象3)又直接引用obj2(对象2);而obj2(对象2)又直接引用obj5(对象5)和该obj2(对象2)本身;而obj5(对象5)直接引用obj1(对象1)。
从上述的描述可以看出,obj1与obj2和obj5存在间接的引用关系。在大多数情况下,当一个对象被串行化时,以该对象为起始点的所有被引用的对象及其相互引用关系要一起串行化,这样才能保证反串行化时能恢复出正确的初始对象图形。
在串行化处理过程中,作为一个整体被串行化或者反串行化的最小单元,称为串行化粒度,通常情况下,作为一个整体被串行化或者反串行化的单元最小可以是单个对象,最大可以是整个对象图形。
在现有技术中,要想串行化内存中的一个对象,归纳起来有两种方法:
第一种方法,一次性地保存或者加载(恢复)该对象及被该对象直接或间接引用着的所有对象,即以整个对象图形作为串行化粒度进行串行化或者反串行化。这种方法比较有代表性的是微软.net平台提供的默认串行化方法。下面参照图1对该方法的原理进行描述,如图1中的obj1被串行化时(即obj1被写入到一个数据流中时),与该obj1有直接引用关系的obj3和obj4,以及与该obj1有间接引用关系的obj2和obj5也要一起被串行化,即obj1与obj2、obj3、obj4、obj5之间的引用关系一起被写入obj1所对应的数据流中,通常,对象之间的这种引用关系由.net平台自身提供的代理器来维护,每个对象类型对应一个代理器,该对象的代理器维护着该对象与其它对象之间的引用关系,也就是说,该5个对象所构成的整个对象图形得到了完整的串行化。
显然,采用这种方法对对象图形执行串行化时,所需的时间和处理资源随着对象图形规模的增大而增加,也即越复杂。包含对象越多的对象图形,执行一次串行化或者反串行化操作所需的时间也就越长。对于那些想要保持对象图形的串行化表示同内存中的活对象完全一致的应用,对象图形中只要有一个对象发生了改变,就必须重新串行化整个对象图形,导致串行化操作耗费大量的时间和各种处理资源。也就意味着,在执行串行化操作的过程中,对象图形不得发生任何改变,否则将导致串行化操作失败或者串行化表示的数据的一致性受到破坏;进一步意味着,在串行化操作执行期间所有对该对象图形的其它并发访问(至少是那些会改变对象图形拓扑关系的访问)都要被挂起。因此,这种方法根本无法应用于对响应速度要求较高的系统。
第二种方法,该方法试图以单个对象为串行化粒度进行串行化或者反串行化操作。通常通过一个串行化管理模块为每个串行化单位(即每个对象)分配一个对应的标识,串行化时用这些标识代表被引用对象写入串行化数据流,而反串行化时通过这些标识去查找相应的被引用对象,进而恢复对象图形。
该方法中,对象被串行化时,仅保存与该对象有直接引用关系的对象的代理。下面仍参照图1描述该方法的原理,如图1中的obj1被串行化到一个数据流中时,与该obj1有直接引用关系的obj3和obj4的对象的代理被一起串行化到该obj1所对应的数据流中,这些对象的代理不是由.net自身提供的,需要当作整个目标系统的一部分来实现。而obj3与obj4本身不会随着obj1被串行化而被串行化,它们总是被分别串行化到与自己对应的数据流中。
从上述的描述可以看出,该方法中的串行化粒度只是该对象图形中的一个单独的对象,与上述第一种方法相比,该方法把整个对象图形划分为若干个部分,每个部分构成一个串行化粒度,在不同的对象图形中,这个粒度可以是几个对象构成的子图形,也可以是单个对象(或者说是最小化的子图形),这种方法有效地解决了对对象图形的串行化粒度的控制问题,这样在处理复杂的对象图形时,串行化的效率会得到极大提高。但是串行化粒度控制通常意味着在系统的设计阶段必须确定一系列的规则,而在实现阶段,编写合适的代码实现以上的规则。通常情况下,对象图形在系统的运行过程中是不断变化的,因此该串行化单位的规则也必须能够正确应对不断变化的对象图形。采用该方法进行串行化操作时,必须为每个串行化单位的对象类型实现大量的串行化代码,每个对象在存储和加载操作时都要处理和其它对象之间的引用关系,增加了系统设计和实现工作的复杂度,若系统中包含多种数据类型,复杂度将进一步提升。同时各个对象类型相互独立(非一致化)串行化实现很容易隐藏大量设计和实现上的缺陷,给软件测试、调试过程带来巨大的负担,增大了在系统设计、实现和维护中的工作量,同时也给软件和硬件系统的运行埋下了不稳定的因素。
该方法中,对象被反串行化时,如obj1被加载时,该方法试图采取“首次访问加载”的机制,即该obj1被加载时,与该obj1与直接引用关系的obj3和obj4的加载被推迟到obj1访问obj3时,obj3才被加载,也就是说,obj3因为被obj1引用而被加载时,首先要判断obj3是否被加载过,若obj3已经被加载过,则不再对obj3进行加载,否则,obj3会被加载。同样道理,obj4的加载也被推迟到obj1访问obj4时,obj4才被加载。只是在某个被引用的对象需要被恢复时才被恢复,即一个对象在首次被访问时,才真正从永久存储介质(即数据流)中恢复(加载)到内存中,这样系统就减少了不必要的恢复运算操作,极大地提高了系统的串行化效率。但是,采用该种方法执行串行化操作的过程中,如果目标系统是并发的多线程系统,对象必须通过实现同步机制确保自身数据在串行化及反串行化过程中不被修改。如果要想真正达成“首次访问加载”的效果,上述串行化实现将进一步复杂化,而且必然会影响本来与串行化无关的正常逻辑,因为在每次使用被引用对象前必须判断该对象是否已经被加载。
因此,如何能够提供一种一致化、串行化粒度可控的对象串行化存储和恢复系统和方法是亟待解决的问题。
发明内容
本发明的目的是提供一种对象的串行化存储和恢复的系统和方法,该系统和方法为目标系统提供一致化、近乎透明的对象存储支持,且极大减少了开发的代价。
为达到上述目的,本发明提供一种对象的串行化存储和恢复的系统,所述系统包括:
串行化包装器生成模块,用于为每个待串行化对象类型分别生成相应的串行化包装器对象类型;
永久化管理器,用于为所述串行化包装器生成模块生成的各个串行化包装器对象类型分别分配相应的对象标识,并为各个串行化包装器对象类型所对应的待串行化对象类型分配相应的串行化数据流;
永久化代理器,用于在所述永久化管理器分配的串行化数据流中维持各待串行化对象类型之间的引用关系;
所述串行化包装器对象类型的实例的被包装对象成员通过.NET内建的串行化机制串行化到对应分配的串行化数据流中。
其中,所述永久化管理器包括,
映射子模块I,用于维护对象标识和串行化包装器对象类型的映射关系,并提供相应的查询接口;
映射子模块II,提供对象串行化、反串行化使用的串行化数据流,维护对象标识到串行化数据流的一一映射关系,并提供相应的查询接口。
所述永久化管理器还可进一步包括:
待串行化对象类型集合子模块,用于维护作为一个事务得到串行化的所有待串行化对象类型;
串行化同步器子模块,用于判定所述待串行化对象类型集合子模块中所有待串行化对象类型执行串行化的时机。
所述待串行化对象类型的形式为源程序代码描述的对象类型,或者为通过反射技术获得的对象类型,或者为CodeDOM对象图形描述的对象类型,或者为Code Model接口描述的对象类型。
所述串行化包装器对象类型的形式为源程序代码描述的对象类型,或者为编译生成的.NET组装件中的对象类型,或者为CodeDOM对象描述的对象类型,或者为Code Model接口描述的对象类型。
所述串行化包装器对象类型和与之对应的待串行化对象类型实现一致的接口。
所述串行化包装器对象类型中包含一个与待串行化对象类型一致的被包装对象成员。
所述串行化包装器对象类型中包含一个与被包装方法对应的包装方法,所述被包装方法为待串行化对象类型中每个可公有访问的非静态、非构造方法,所述包装方法通过被包装对象成员调用与之对应的被包装方法。
所述包装方法和被包装方法的方法名、返回值类型以及参数类型不完全一致。
所述包装方法和被包装方法的方法名、返回值类型以及参数类型还可以完全一致。
所述串行化包装器对象类型中包含一个与被包装构造方法对应的包装构造方法,所述被包装构造方法为待串行化对象类型中每个可公有访问构造方法,所述包装构造方法调用与之对应的被包装构造方法,创建一个与所述串行化包装器对象类型对应的待串行化对象类型的实例,将该实例赋予所述的待串行化对象类型成员。
所述包装构造方法和被包装构造方法的返回值类型以及参数类型不完全一致。
所述包装构造方法和被包装构造方法的返回值类型以及参数类型还可以完全一致。
所述串行化包装器对象类型的每个实例均含有一个与之对应的唯一对象标识。
所述串行化包装器对象类型包含一个成员变量,该成员变量用于保存与该串行化包装器对象类型对应的对象标识。
所述串行化包装器对象类型用.NET元数据属性SerializableAttribute标记,并实现串行化ISerializable接口。
所述永久化代理器用成员变量分别保存被代理对象的对象类型和对象标识。
本发明还提供一种对象的串行化存储和恢复的方法,包括如下步骤:
(a)为每个待串行化对象类型分别生成相应的串行化包装器对象类型;
(b)永久化管理器为每个串行化包装器对象类型分别分配相应的对象标识,并为各个串行化包装器对象类型所对应的待串行化对象类型分配相应的串行化数据流,所述对象标识与串行化数据流对应;
(c)创建一个永久化代理器,所述永久化代理器在串行化数据流中维持待串行化对象类型之间的引用关系;
所述串行化包装器对象类型的实例的被包装对象成员通过.NET内建的串行化机制串行化到对应分配的串行化数据流中。
其中,所述步骤(a)具体为:
(a1)编写各个待串行化对象类型的接口属性、方法部分,并为待串行化对象类型分别添加“待包装标记元数据属性”标记;
(a2)对所述步骤(a1)中有“待包装标记元数据属性”标记的待串行化对象类型进行编译,得到.NET组装件;
(a 3)通过.NET提供的反射技术获取.NET组装件中的所有待串行化对象类型,并生成串行化包装器对象类型的源代码;
(a4)为所述(a1)步骤中的各个待串行化对象类型编写具体的实现代码;
(a5)将所述(a3)步骤中的串行化包装器对象类型的源代码和(a4)步骤各个待串行化对象类型的具体的实现代码一起编译,得到组装件。
所述步骤(c)或者(a5)之后还包括:
(d)当串行化包装器对象类型的实例的被包装对象成员执行串行化时,为将要执行串行化的串行化包装器对象类型的实例的被包装对象成员所引用的串行化包装器对象类型的实例,创建永久化代理器的对象实例,所述永久化代理器的对象实例与将要执行串行化的串行化包装器对象类型的实例的被包装对象成员,一起串行化到所述将要执行串行化的串行化包装器对象类型的实例所对应的串行化数据流中。
所述步骤(d)之后还包括:
(e)串行化包装器对象类型的实例的被包装对象成员执行反串行化时,永久化代理器以被代理对象的对象标识向永久化管理器查询被代理对象,如果查询成功,则把查到的对象作为引用修正的结果;如果查询失败,则永久化代理器创建一个未初始化的串行化包装器对象实例,并在永久化管理器维护的对象标识到串行化包装器对象实例的映射集合中建立相应映射。
本发明通过串行化包装器生成模块,将各种待串行化对类型转换成统一的串行化包装器对象类型,实现一致的串行化(反串行化)处理,不必为每个作为串行化粒度的对象类型实现大量的串行化代码,串行化粒度得到很好的控制;在反串行化的引用修正阶段,永久化代理器以被代理对象的对象标识向永久化管理器查询被代理对象,如果查询成功,则把查到的对象作为引用修正的结果;如果查询失败一即永久化管理器维护的对象标识到串行化包装器对象实例的映射集合中找不到永久化代理器提供的对象标识,则永久化代理器创建一个未初始化的串行化包装器对象实例,并在永久化管理器维护的对象标识到串行化包装器对象实例的映射集合中建立相应映射,实现首次访问加载。而且,本发明在尽量不给系统的实现工作增加负担的前提下,为目标系统提供一致化的、近乎透明的(即目标系统几乎察觉不到自己对对象存储系统的依赖)对象存储支持。开发任意的目标系统时,使用本发明提供的对象串行化存储和恢复系统作为其存储支撑子系统,均可一致化地获得上述背景技术中第二种方法所能够达成的积极效果,同时把使用现有技术所必须附加的代价(包括开发和其它各个方面的代价)降低到极小的程度,甚至完全消除这些代价。
附图说明
图1为对象图形示意图;
图2为本发明的系统的整体结构示意图;
图3为图2所示系统中的永久化管理器的结构示意图;
图4为图2所示系统中的串行化包装器生成模块的工作流程图;
图5为本发明系统在执行串行化时的流程示意图;
图6为本发明方法的整体流程图;
图7为本发明方法的较佳实施例流程图。
具体实施方式
为了使本发明的目的、方案以及效果更加清楚,下面结合附图对本发明方案的实施方式进行详细描述:
本发明的系统的整体结构如图2所示,包括:
串行化包装器生成模块,用于为每个待串行化对象类型分别生成相应的串行化包装器对象类型;
永久化管理器,用于为所述串行化包装器生成模块生成的各个串行化包装器对象类型分别分配相应的对象标识,并为各个串行化包装器对象类型所对应的待串行化对象类型分配相应的串行化数据流,较佳的,所述对象标识与串行化数据流一一对应;
永久化代理器,用于在所述永久化管理器分配的串行化数据流中维持各待串行化对象类型之间的引用关系。
如图3所示,其中永久化管理器包括:
映射子模块I,用于维护对象标识和串行化包装器对象类型的一一映射关系,并提供相应的查询接口;串行化包装器对象类型的每一个实例也与该对象标识一一对应,该对象标识不受串行化、反串行化操作影响。
映射子模块II,提供对象串行化、反串行化使用的串行化数据流,维护对象标识到串行化数据流的一一映射关系,并提供相应的查询接口。
为支持多线程环境下的事务的串行化处理,对象必须通过实现同步机制确保自身数据在串行化及反串行化过程中不被修改,为此永久化管理器还包括:
待串行化对象类型集合子模块,用于维护作为一个事务得到串行化的所有待串行化对象类型;
串行化同步器子模块,用于判定待串行化对象类型集合子模块中所有待串行化对象类型执行串行化的恰当时机。
其中,待串行化对象类型的形式可以是源程序代码描述的对象类型、或者通过反射技术编译获得的对象类型(如.net中的system.type对象)、或者CodeDOM对象图形描述的对象类型(如system.CodeDOM.CodeTypeDeclaration对象)、或者Code Model接口描述的对象类型(如.net中的EnvDTE.CodeType接口)。
串行化包装器对象类型的形式可以是源程序代码描述的对象类型、或者反射技术编译获得的对象类型(如.net中的system.type对象)、或者CodeDOM对象图形描述的对象类型(如system.CodeDOM.CodeTypeDeclaration对象)、或者Code Model接口描述的对象类型(如.net中的EnvDTE.CodeType接口)。
串行化包装器生成模块为每个待串行化对象类型分别生成相应的串行化包装器对象类型的过程中,可以首先通过反射技术编译获取一个包含所有待串行化对象类型的.net组装件,然后串行化包装器生成模块为.net组装件中的所有待串行化对象类型分别生成以CodeDOM对象的形式描述的串生化包装器对象类型,并用.net编译技术将所述串行化包装器对象类型编译生成一个组装件。
串行化包装器生成模块为每个待串行化对象类型分别生成相应的串行化包装器对象类型的过程中,还可以首先通过反射技术编译获取一个包含所有待串行化对象类型的.net组装件,从中选取用预定义的“待包装标记元数据属性”标记过的待串行化对象类型,为这些对待串行化对象类型分别生成以CodeDOM对象的形式描述的串行化包装器对象类型,并用.net编译技术将所述串行化包装器对象类型编译生成一个组装件。
为了使串行化包装器对象类型能够有更好的兼容性,需要为待串行化对象类型和串行化包装器对象类型实现一致的接口。
上述串行化包装器对象类型中包含一个与待串行化对象类型一致的成员变量,其中,该成员变量称为被包装对象成员。
上述串行化包装器对象类型中包含一个包装方法,上述待串行化对象类型中包含一个被包装方法(被包装方法是指,待串行化对象类型中每个可公有访问的非静态、非构造方法),为了使串行化包装器对象类型能够有更好的兼容性,需要实现包装方法和被包装方法的方法名、返回值类型以及参数类型完全一致。当然,也可以使包装方法和被包装方法的方法名、返回值类型以及参数类型不完全一致。
其中,包装方法通过被包装对象成员调用与之对应的被包装方法。
在包装方法在调用与之对应的被包装方法之前,包装方法检查被包装对象成员是否已初始化,如果该成员尚未得到初始化,则使用.NET内建的反串行化机制将串行化数据流中的数据恢复成活对象,并将该对象赋予被包装对象成员;如果被包装对象成员已被初始化则不进行反串行化处理。
在包装方法在调用与之对应的被包装方法之后,使用.NET内建的串行化机制将被包装对象成员串行化到串行化数据流中;如果对象标识已被初始化,则使用该对象标识执行串行化;如果对象标识尚未得到初始化,则先请求永久化管理器分配一个新的对象标识,以此对象标识初始化对象标识成员,然后使用此对象标识执行串行化。
在支持多线程环境下的事务的串行化处理时,考虑同步机制的情况下:包装方法在调用与之对应的被包装方法之前,调用串行化同步器子模块相应的方法,要求增加一个“暂停串行化”计数器,如果增加暂停串行化计数器的要求正处于挂起状态,则该调用会一直等待,直到挂起被解除,之后,包装方法检查被包装对象成员是否已初始化,如果该被包装对象成员尚未得到初始化,则使用.NET内建的反串行化机制将数据流中的数据恢复成活对象,并将该活对象赋予被包装对象成员;如果被包装对象成员已被初始化则不进行反串行化处理。
包装方法在调用与之对应的被包装方法之后,包装方法使用.NET内建的串行化机制请求待串行化集合子模块将其对象标识加入待串行化集合子模块,如果对象标识已被初始化,则使用该对象标识执行串行化;如果对象标识尚未得到初始化,则先请求映射子模块II分配一个新的对象标识,以此对象标识初始化对象标识成员,然后使用此对象标识执行串行化,同时调用串行化同步器子模块的相应方法减少一个暂停串行化计数,每次减少一个暂停串行化计数后,串行化同步器子模块检查该计数是否为零,如果为零,则挂起所有要求增加暂停串行化计数的请求,并使用.NET内建的串行化机制,将待串行化集合子模块中的对象标识对应的串行化包装器对象类型的实例的被包装对象成员分别串行化到它们各自对应的永久化管理器提供的数据流对象中。在串行化操作执行完毕后,解除对增加暂停串行化计数的要求的挂起;如不为零则不进行更多的处理。
串行化包装器对象类型中包含一个包装构造方法,上述待串行化对象类型中包含一个被包装构造方法(被包装构造方法是指,待串行化对象类型中每个可公有访问构造方法),为了使串行化包装器对象类型能够有更好的兼容性,需要实现该包装构造方法和被包装构造方法的返回值类型以及参数类型完全一致。当然,也可以使包装构造方法和被包装构造方法的返回值类型以及参数类型不完全一致。
包装构造方法调用与之对应的被包装构造方法,创建一个与所述串行化包装器对象类型对应的待串行化对象类型的实例,将该实例赋予所述的待串行化对象类型的成员。
永久化代理器用于维护待串行化对象之间的引用关系,并用成员变量分别保存该永久化代理器所代理的串行化包装器对象类型和该串行化包装器对象类型所对应的对象标识;
在执行串行化时,即当所述串行化包装器对象类型的实例因对象引用关系而要执行串行化时,创建一个永久化代理器,作为自身的代理写入串行化数据流。
在执行反串行化时,永久化代理器以被代理对象的对象标识向永久化管理器查询被代理对象,如果查询成功,则把查到的对象作为反串行化的结果;如果查询失败,即永久化管理器维护的对象标识到串行化包装器对象实例的映射集合中找不到永久化代理器提供的对象标识,则实例化永久化代理器对象,即生成一个该代理器所代理的未初始化的串行化包装器对象类型和对象标识的实例,并在映射子模块I中建立相应映射关系。
串行化包装器对象类型的实例的被包装对象成员串行化时使用的数据流用文件流对象实现,每个串行化包装器对象对应一个文件,文件用对象标识命名。
下面结合图1和图4对本发明系统中的串行化包装器生成模块的工作原理进行说明:
(1)编写各个待串行化对象类型的接口属性、方法(即非静态公有属性、方法)部分,但不编写具体实现代码;如为图1中的obj1、obj2、obj3、obj4、obj5五个待串行化对象类型分别编写接口属性、方法部分的代码;且为该五个待串行化对象类型分别添加“待包装标记元数据属性”标记,当然不需要串行化的对象类型可以不用添加该“待包装标记元数据属性”标记。
(2)对上述含有“待包装标记元数据属性”标记的五个待串行化对象类型进行编译,得到.NET组装件,记为A。
(3)串行化包装器生成模块可以通过。NET提供的反射技术获取组装件A中的所有待串行化对象类型,并生成obj1-obj5五个对象类型对应的串行化包装器对象类型(记为W1-W5)的源代码。
当然,如果组装件A中的待串行化对象类型没有被全部用“待包装标记元数据属性”标记过,则从中选取那些被全部用“待包装标记元数据属性”标记过的所有待串行化对象类型。
(4)为上述第(1)步中的各个待串行化对象类型编写具体的实现代码;当需要建立待串行化对象类型间的引用关系时,将上述第(3)步中生成的串行化包装器对象类型作为引用的对象。
例如:图1中,Obj1引用了Obj3,这需要实现:为对象类型Obj1声明一个W3类型(Obj3对应的串行化包装器对象类型)的成员变量;因为串行化包装器对象类型实现了被包装的对象类型的所有公有方法和属性,其它的实现工作不会受到影响。
(5)将上述第(3)步中的串行化包装器对象类型W1-W5的源代码和第(4)步各个待串行化对象类型的具体的实现代码一起编译,得到组装件,记为Aw。
下面结合图5对本发明系统执行串行化时的工作原理进行说明:
(1)串行化包装器生成模块分别为Obj1、Obj3和Obj4生成相应的串行化包装生成器类型W1、W3和W4。
(2)W1向永久化管理器申请串行化数据流,永久化管理器中的映射子模块II为W1实例分配一个串行化数据流S1。
(3)当Obj1的实例串行化时,即Obj1的实例被写入串行化数据流S1中,被Obj1的实例所直接引用的W3、W4对象实例,分别创建永久化代理器的对象实例如图5中的At,At作为W3和W4的代理一起串行化到Obj1对应的数据流S1中;而被间接引用的Obj3、Obj4对象实例并未串行化。这就达到了控制串行化粒度的目的。
在反串行化的引用修正阶段,永久化代理器以被代理对象的对象标识向永久化管理器查询被代理对象,如果查询成功,则把查到的对象作为引用修正的结果;如果查询失败--即永久化管理器维护的对象标识到串行化包装器对象实例的映射集合中找不到永久化代理器提供的对象标识,则永久化代理器创建一个未初始化的串行化包装器对象实例,并在永久化管理器维护的对象标识到串行化包装器对象实例的映射集合中建立相应映射,这就实现首次访问加载的效果。
本发明的系统执行串行化时,可以将永久化管理器(及其所有子模块)和永久化代理器的实现代码编译为一个.NET类库(d11)组装件,记为S,该组装件S和图4种所述的组装件Aw共同构成本发明的系统;或者将永久化管理器(及其所有子模块)、永久化代理器和待包装标记元数据属性的实现代码编译为一个.NET类库(d11)组装件,记为S,该组装件S和图4种所述的组装件Aw共同构成本发明的系统。
本发明的串行化包装器生成模块不仅可以应用于串行化技术,而且也可应用于其它的面向对象编程技术中;本发明的系统不仅可以应用于.NET的开发平台,也可应用于所有编译性的开发平台,如JAVA.IO平台。
本发明通过设计串行化包装器生成模块,将各种待串行化对类型转换成统一的串行化包装器对象类型,实现一致的串行化(反串行化)处理,不必为每个作为串行化粒度的对象类型实现大量的串行化代码,串行化粒度得到很好的控制;在反串行化的引用修正阶段,永久化代理器以被代理对象的对象标识向永久化管理器查询被代理对象,如果查询成功,则把查到的对象作为引用修正的结果;如果查询失败--即永久化管理器维护的对象标识到串行化包装器对象实例的映射集合中找不到永久化代理器提供的对象标识,则永久化代理器创建一个未初始化的串行化包装器对象实例,并在永久化管理器维护的对象标识到串行化包装器对象实例的映射集合中建立相应映射,实现首次访问加载。
与现有技术相比,本发明的系统在尽量不给系统的实现工作增加负担的前提下,为目标系统提供一致化的、近乎透明的(即目标系统几乎察觉不到自己对对象存储系统的依赖)对象存储支持。开发任意的目标系统时,使用本发明的提供的对象串行化存储和恢复系统作为其存储支撑子系统,可一致化地获得上述背景技术中第二种方法所能够达成的积极效果,同时把使用现有技术所必须附加的代价(包括开发和其它各个方面的代价)降低到极小的程度,甚至完全消除这些代价。
与上述对象的串行化存储和恢复系统相对应,本发明还提供一种对象的串行化存储和恢复的方法,如图6所示,包括如下步骤:
(a)为每个待串行化对象类型分别生成相应的串行化包装器对象类型;
(b)永久化管理器为每个串行化包装器对象类型分别分配相应的对象标识,并为各个串行化包装器对象类型所对应的待串行化对象类型分配相应的串行化数据流,较佳的,所述对象标识与串行化数据流一一对应;
(c)创建一个永久化代理器,该永久化代理器在串行化数据流中维持待串行化对象类型之间的引用关系。
其中,如图7所示,上述步骤(a)具体为:
(a1)编写各个待串行化对象类型的接口属性、方法部分,并为待串行化对象类型分别添加“待包装标记元数据属性”标记;
(a2)对所述步骤(a1)中有“待包装标记元数据属性”标记的待串行化对象类型进行编译,得到.NET组装件;
(a3)通过.NET提供的反射技术获取.NET组装件中的所有待串行化对象类型,并生成串行化包装器对象类型的源代码;
(a4)为所述(a1)步骤中的各个待串行化对象类型编写具体的实现代码;
(a5)将所述(a3)步骤中的串行化包装器对象类型的源代码和(a4)步骤各个待串行化对象类型的具体的实现代码一起编译,得到组装件。
上述步骤(c)或者(a5)之后还包括:
(d)当串行化包装器对象类型的实例的被包装对象成员执行串行化时(即被包装对象成员串行化到与之对应的串行化数据流中时),为将要执行串行化的串行化包装器对象类型的实例的被包装对象成员所引用的串行化包装器对象类型的实例,创建永久化代理器的对象实例,该永久化代理器的对象实例与将要执行串行化的串行化包装器对象类型的实例的被包装对象成员,一起串行化到该将要执行串行化的串行化包装器对象类型的实例所对应的串行化数据流中。
(e)串行化包装器对象类型的实例的被包装对象成员执行反串行化的引用修正阶段,永久化代理器以被代理对象的对象标识向永久化管理器查询被代理对象,如果查询成功,则把查到的对象作为引用修正的结果;如果查询失败--即永久化管理器维护的对象标识到串行化包装器对象实例的映射集合中找不到永久化代理器提供的对象标识,则永久化代理器创建一个未初始化的串行化包装器对象实例,并在永久化管理器维护的对象标识到串行化包装器对象实例的映射集合中建立相应映射,实现首次访问加载。
本发明的方法通过为每个待串行化对象类型分别生成相应的串行化包装器对象类型,实现一致的串行化(反串行化)处理,不必为每个作为串行化粒度的对象类型实现大量的串行化代码,串行化粒度得到很好的控制;在反串行化的引用修正阶段,永久化代理器以被代理对象的对象标识向永久化管理器查询被代理对象,如果查询成功,则把查到的对象作为引用修正的结果;如果查询失败--即永久化管理器维护的对象标识到串行化包装器对象实例的映射集合中找不到永久化代理器提供的对象标识,则永久化代理器创建一个未初始化的串行化包装器对象实例,并在永久化管理器维护的对象标识到串行化包装器对象实例的映射集合中建立相应映射,实现首次访问加载。
与现有技术相比,本发明的方法在尽量不给系统的实现工作增加负担的前提下,为目标系统提供一致化的、近乎透明的(即目标系统几乎察觉不到自己对对象存储系统的依赖)对象存储支持。开发任意的目标系统时,使用本发明的提供的对象串行化存储和恢复的方法,可一致化地获得上述背景技术中第二种方法所能够达成的积极效果,同时把使用现有技术所必须附加的代价(包括开发和其它各个方面的代价)降低到极小的程度,甚至完全消除这些代价。
以上结合较佳实施例来描述本发明,但并不用以限制本发明,本技术领域的普通技术人员应当知道,凡在本发明的实施例的思想的应用范围内所作的等效目的的变更与修改,均应在本专利申请的保护范围之内。
Claims (27)
1、一种对象的串行化存储和恢复的系统,其特征在于,所述系统包括:
串行化包装器生成模块,用于为每个待串行化对象类型分别生成相应的串行化包装器对象类型;
永久化管理器,用于为所述串行化包装器生成模块生成的各个串行化包装器对象类型分别分配相应的对象标识,并为各个串行化包装器对象类型所对应的待串行化对象类型分配相应的串行化数据流;
永久化代理器,用于在所述永久化管理器分配的串行化数据流中维持各待串行化对象类型之间的引用关系;
所述串行化包装器对象类型的实例的被包装对象成员通过.NET内建的串行化机制串行化到对应分配的串行化数据流中。
2、根据权利要求1所述的对象的串行化存储和恢复的系统,其特征在于,所述永久化管理器包括,
映射子模块I,用于维护对象标识和串行化包装器对象类型的映射关系,并提供相应的查询接口;
映射子模块II,提供对象串行化、反串行化使用的串行化数据流,维护对象标识到串行化数据流的映射关系,并提供相应的查询接口。
3、根据权利要求2所述的对象的串行化存储和恢复的系统,其特征在于,所述永久化管理器还包括,
待串行化对象类型集合子模块,用于维护作为一个事务得到串行化的所有待串行化对象类型;
串行化同步器子模块,用于判定所述待串行化对象类型集合子模块中所有待串行化对象类型执行串行化的时机。
4、根据权利要求1所述的对象的串行化存储和恢复的系统,其特征在于,所述待串行化对象类型的形式为源程序代码描述的对象类型。
5、根据权利要求1所述的对象的串行化存储和恢复的系统,其特征在于,所述待串行化对象类型的形式为通过反射技术获得的对象类型。
6、根据权利要求1所述的对象的串行化存储和恢复的系统,其特征在于,所述待串行化对象类型的形式为CodeDOM对象图形描述的对象类型。
7、根据权利要求1所述的对象的串行化存储和恢复的系统,其特征在于,所述待串行化对象类型的形式为Code Model接口描述的对象类型。
8、根据权利要求1所述的对象的串行化存储和恢复的系统,其特征在于,所述串行化包装器对象类型的形式为源程序代码描述的对象类型。
9、根据权利要求1所述的对象的串行化存储和恢复的系统,其特征在于,所述串行化包装器对象类型的形式为编译生成的.NET组装件中的对象类型。
10、根据权利要求1所述的对象的串行化存储和恢复的系统,其特征在于,所述串行化包装器对象类型的形式为CodeDOM对象描述的对象类型。
11、根据权利要求1所述的对象的串行化存储和恢复的系统,其特征在于,所述串行化包装器对象类型的形式为Code Model接口描述的对象类型。
12、根据权利要求1所述的对象的串行化存储和恢复的系统,其特征在于,所述串行化包装器对象类型和与之对应的待串行化对象类型实现一致的接口。
13、根据权利要求1所述的对象的串行化存储和恢复的系统,其特征在于,所述串行化包装器对象类型中包含一个与待串行化对象类型一致的被包装对象成员。
14、根据权利要求13所述的对象的串行化存储和恢复的系统,其特征在于,所述串行化包装器对象类型中包含一个与被包装方法对应的包装方法,所述被包装方法为待串行化对象类型中每个可公有访问的非静态、非构造方法,所述包装方法通过被包装对象成员调用与之对应的被包装方法。
15、根据权利要求14所述的对象的串行化存储和恢复的系统,其特征在于,所述包装方法和被包装方法的方法名、返回值类型以及参数类型不完全一致。
16、根据权利要求14所述的对象的串行化存储和恢复的系统,其特征在于,所述包装方法和被包装方法的方法名、返回值类型以及参数类型完全一致。
17、根据权利要求1所述的对象的串行化存储和恢复的系统,其特征在于,所述串行化包装器对象类型中包含一个与被包装构造方法对应的包装构造方法,所述被包装构造方法为待串行化对象类型中每个可公有访问构造方法,所述包装构造方法调用与之对应的被包装构造方法,创建一个与所述串行化包装器对象类型对应的待串行化对象类型的实例,将该实例赋予所述的待串行化对象类型成员。
18、根据权利要求17所述的对象的串行化存储和恢复的系统,其特征在于,所述包装构造方法和被包装构造方法的返回值类型以及参数类型不完全一致。
19、根据权利要求17所述的对象的串行化存储和恢复的系统,其特征在于,所述包装构造方法和被包装构造方法的返回值类型以及参数类型完全一致。
20、根据权利要求1所述的对象的串行化存储和恢复的系统,其特征在于,所述串行化包装器对象类型的每个实例均含有一个与之对应的唯一对象标识。
21、根据权利要求1或20所述的对象的串行化存储和恢复的系统,其特征在于,所述串行化包装器对象类型包含一个成员变量,所述成员变量用于保存与所述串行化包装器对象类型对应的对象标识。
22、根据权利要求21所述的对象的串行化存储和恢复的系统,其特征在于,所述串行化包装器对象类型用.NET元数据属性SerializableAttribute标记,并实现串行化ISerializable接口。
23、根据权利要求1所述的对象的串行化存储和恢复的系统,其特征在于,所述永久化代理器用成员变量分别保存被代理对象的对象类型和对象标识。
24、一种对象的串行化存储和恢复的方法,其特征在于,包括如下步骤:
(a)为每个待串行化对象类型分别生成相应的串行化包装器对象类型;
(b)永久化管理器为每个串行化包装器对象类型分别分配相应的对象标识,并为各个串行化包装器对象类型所对应的待串行化对象类型分配相应的串行化数据流,所述对象标识与串行化数据流一一对应;
(c)创建一个永久化代理器,所述永久化代理器在串行化数据流中维持待串行化对象类型之间的引用关系;
所述串行化包装器对象类型的实例的被包装对象成员通过.NET内建的串行化机制串行化到对应分配的串行化数据流中。
25、根据权利要求24所述的对象的串行化存储和恢复的方法,其特征在于,所述步骤(a)具体为:
(a1)编写各个待串行化对象类型的接口属性、方法部分,并为待串行化对象类型分别添加“待包装标记元数据属性”标记;
(a2)对所述步骤(a1)中有“待包装标记元数据属性”标记的待串行化对象类型进行编译,得到.NET组装件;
(a3)通过.NET提供的反射技术获取.NET组装件中的所有待串行化对象类型,并生成串行化包装器对象类型的源代码;
(a4)为所述(a1)步骤中的各个待串行化对象类型编写具体的实现代码;
(a5)将所述(a3)步骤中的串行化包装器对象类型的源代码和(a4)步骤各个待串行化对象类型的具体的实现代码一起编译,得到组装件。
26、根据权利要求24或25所述的对象的串行化存储和恢复的方法,其特征在于,所述步骤(c)之后还包括:
(d)串行化包装器对象类型的实例的被包装对象成员执行串行化时,为将要执行串行化的串行化包装器对象类型的实例的被包装对象成员所引用的串行化包装器对象类型的实例,创建永久化代理器的对象实例,所述永久化代理器的对象实例与将要执行串行化的串行化包装器对象类型实例的被包装对象成员,一起串行化到所述将要执行串行化的串行化包装器对象类型的实例所对应的串行化数据流中。
27、根据权利要求26所述的对象的串行化存储和恢复的方法,其特征在于,所述步骤(d)之后还包括:
(e)串行化包装器对象类型的实例的被包装对象成员执行反串行化时,永久化代理器以被代理对象的对象标识向永久化管理器查询被代理对象,如果查询成功,则把查到的对象作为引用修正的结果;如果查询失败,则永久化代理器创建一个未初始化的串行化包装器对象实例,并在永久化管理器维护的对象标识到串行化包装器对象实例的映射集合中建立相应映射。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2007101108954A CN100517224C (zh) | 2007-06-13 | 2007-06-13 | 对象的串行化存储和恢复的系统和方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2007101108954A CN100517224C (zh) | 2007-06-13 | 2007-06-13 | 对象的串行化存储和恢复的系统和方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101082866A CN101082866A (zh) | 2007-12-05 |
CN100517224C true CN100517224C (zh) | 2009-07-22 |
Family
ID=38912451
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2007101108954A Expired - Fee Related CN100517224C (zh) | 2007-06-13 | 2007-06-13 | 对象的串行化存储和恢复的系统和方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN100517224C (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9026993B2 (en) | 2008-06-27 | 2015-05-05 | Microsoft Technology Licensing, Llc | Immutable types in imperitive language |
US8495329B2 (en) * | 2009-04-13 | 2013-07-23 | Microsoft Corporation | Type system support for memory isolation permissions |
US9569282B2 (en) | 2009-04-24 | 2017-02-14 | Microsoft Technology Licensing, Llc | Concurrent mutation of isolated object graphs |
US9971578B2 (en) | 2012-10-15 | 2018-05-15 | Microsoft Technology Licensing, Llc | Reference attribute annotation signifying no external reference |
CN106648569B (zh) * | 2015-11-02 | 2021-04-20 | 腾讯科技(深圳)有限公司 | 目标序列化实现方法和装置 |
CN109656567B (zh) * | 2018-12-20 | 2022-02-01 | 北京树根互联科技有限公司 | 异质化业务数据处理逻辑的动态方法和系统 |
CN111625332A (zh) * | 2020-05-21 | 2020-09-04 | 杭州安恒信息技术股份有限公司 | Java线程池拒绝策略执行方法、装置和计算机设备 |
-
2007
- 2007-06-13 CN CNB2007101108954A patent/CN100517224C/zh not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
CN101082866A (zh) | 2007-12-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11175896B2 (en) | Handling value types | |
Orso et al. | A technique for dynamic updating of Java software | |
CN100517224C (zh) | 对象的串行化存储和恢复的系统和方法 | |
US10146515B1 (en) | Live code updates | |
CN100489778C (zh) | Java程序可动态更新化实现方法 | |
US7380242B2 (en) | Compiler and software product for compiling intermediate language bytecodes into Java bytecodes | |
US6298353B1 (en) | Checking serialization compatibility between versions of java classes | |
Graunke et al. | Programming the web with high-level programming languages | |
US7421716B1 (en) | System and method for providing composite applications | |
US20080301636A1 (en) | Per-instance and per-class aspects | |
US20050071809A1 (en) | System and method for serializing objects in a compiled programming language | |
US7219341B2 (en) | Code analysis for selective runtime data processing | |
US20190087211A1 (en) | Re-Playable Execution Optimized for Page Sharing in a Managed Runtime Environment | |
US7421715B1 (en) | System and method for dynamic late-binding of persistent object implementations in software-based systems | |
Puripunpinyo et al. | Effect of optimizing Java deployment artifacts on AWS Lambda | |
Tilevich et al. | Aspectizing server-side distribution | |
Stadler et al. | Lazy continuations for Java virtual machines | |
US9253286B2 (en) | Computer program composed from tabular storage structures that includes data and code | |
US20080301635A1 (en) | Per-instance and per-class aspects | |
US20080114943A1 (en) | Adding one or more computers to a multiple computer system | |
US20030088851A1 (en) | Method and system for global constant management for memory | |
US20060123383A1 (en) | Method and apparatus for a system management tool to adapt command interface and behavior based on installed features | |
Cabral et al. | Rail: code instrumentation for. net | |
Gregersen et al. | Towards a Dynamic-update-enabled JVM | |
Previtali | Dynamic updates: Another middleware service? |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20090722 Termination date: 20190613 |
|
CF01 | Termination of patent right due to non-payment of annual fee |