对象存储方法和系统的制作方法

文档序号:6333540阅读:180来源:国知局
专利名称:对象存储方法和系统的制作方法
技术领域
本发明涉及数据存储技术,尤其涉及对象存储方法和系统。
背景技术
在面向对象的编程(OOP)领域中,经常需要将内存中的对象(Object)持久化到磁 盘中进行存储,这个过程一般分为两个部分首先将内存中的对象进行编码,也就是将内存 中的数据编码为字节流,这个过程一般被称为序列化,然后将序列化后得出的字节流持久 化存储到磁盘的文件中。反之,从磁盘上的文件中读取字节流,然后将字节流转化为内存中 的对象的过程一般被称为反序列化。在不同的程序语言平台上,如目前主流的JAVA和DotNet平台,都有关于序列化和 反序列化方法的实现,它们都通过提供一个标准接口,将用户的对象进行序列化和反序列 化,这其中最重要的过程是将内存中的对象转化为字节流的过程及其反转换过程,以上两 个平台提供的标准接口在转换字节流的过程中,会将对象的类型信息(Class Type),对象 的成员的数据类型(Data Type),对象的数据(Data)以及其他一些控制信息写入到字节流 中,这其中除了数据本身以外,其他的信息都是为了在反序列化过程中重新在内存中构造 对象(我们可以将这些信息称为元数据),然后再将数据赋值到对象,从而完成整个反序列 化过程。上述这种方法在持久化一些大型对象,如数十KB大小的对象时,会带来一些额外 的空间开销我们知道,在内存中对象的大小,如果是使用C语言,可以用SizeofO求得, 具体的计算方式为从第一个成员所占的字节数一直累加到最后一个成员(根据平台或编 译设置的不同还会有大小不一样的对齐字节),实际上并不包含任何类型信息,这样求出的 大小就大概等于字节流中对象的数据的大小,假设该对象的成员比较多,特别是还有成员 引用其他对象的情况,那么序列化后对应的非数据信息,也就是元数据也会很多,某些情况 下,该部分甚至超过了对象数据的本身。另外,我们再来看一种情况,如果我们需要连续的 更新一个大对象,并且还要存储该对象上一次的状态(历史数据),换句话说我们更新η次, 就会存储η个字节流,每个字节流的大小都会有差不多的大小,但实际上每次更新对象只 是改变了很少的几个成员。如果应用场景对存储空间有比较严格的要求,那么在上述的两 种情况下,字节流将会占用很大的磁盘存储空间。因此,需要一种对象存储方式,来解决大对象占用很大存储空间的问题,将大对象 持久化,节省时间和存储成本。

发明内容
鉴于以上,本发明的技术方案所要解决的技术问题在于,提供一种对象存储方法 和系统,来解决大对象占用很大存储空间的问题,将大对象持久化,节省时间和存储成本。本发明提供了一种对象存储方法,包括步骤102,对对象的多个实例进行序列化 处理,获得每个实例的字节流;步骤104,将所述多个实例中的第一个实例的字节流依次与
4其他实例的字节流进行比较,获得多个差异流;步骤106,将所述第一个实例的字节流和所 述多个差异流进行存储,以用于表示所述对象的多个实例。通过该技术方案,将大对象处理 为一个字节流和多个体积更小的差异流,就可以减少大对象的存储空间。在上述技术方案中,优选地,包括步骤101,预置字节流格式;在所述步骤102中, 根据所述字节流格式,对所述对象的多个实例进行序列化处理,获得每个实例的字节流。在上述技术方案中,优选地,在所述步骤101中,还预置对象表和字符串表,其中, 所述对象表中记录每个对象的对象代码,所述字符串表用于对每个对象的实例的字符串成 员进行哈希处理以得到索引值;在所述步骤102中,对所述每个实例进行序列化处理时, 对于所述每个实例中的值类型成员,将所述值类型成员的值写入到所述每个实例的字节流 中,对于所述每个实例中的引用类型成员,在所述对象表中存在所述引用类型成员的引用 对象的对象代码,将所述引用对象的对象代码写入所述每个实例的字节流,在所述对象表 中不存在所述引用对象的信息时,将所述引用对象写入到所述每个实例的字节流中,并在 所述对象表生成所述引用对象的代码,对于所述每个实例中的字符串类型成员,根据所述 字符串表对所述字符串成员进行哈希处理,在所述字符串表不存在该成员时,将得到的所 述字符串成员的哈希索引值及字符串成员写入所述每个实例的字节流中,反之则只在字节 流中写入哈希索引值。通过该技术方案,可以将大对象按照预先设置的字节流格式对每一 部分作相应的处理,得到所需的字节流,避免了重复记录。在上述技术方案中,优选地,每个字节流包括固定长度数据流,记录对应对象中 值类型成员的值,引用类型成员对应的固定长度的对象或对象代码;非固定长度数据流,记 录所述对应对象中引用类型成员对应的非固定长度的对象;字符串数据流,记录所述对应 对象中的字符串类型成员和其对应的哈希索引值。在上述技术方案中,优选地,在所述步骤104中,根据所述其他实例中指定实例的 字节流中的固定长度数据流与所述第一个实例的字节流中的固定长度数据流的比较结果, 所述指定实例的字节流中的字符串数据流与所述第一个实例的字节流中的字符串数据流 的比较结果,以及所述指定实例的字节流的非固定长度数据流,得到所述指定实例的差异 流。通过该技术方案,将字节流的各个对应部分相比较得到体积更小的差异流。在上述技术方案中,优选地,还包括步骤108,根据所述第一个实例的字节流和 所述多个差异流,获得所述对象的多个实例的字节流;步骤110,对所述对象的多个实例的 字节流进行反序列化处理,得到所述对象的多个实例。通过上述技术方案,可以实现一种对象存储方法,可以大大减小大对象的存储空 间,避免了对象和字符串的重复引用的问题。本发明还提供了一种对象存储系统,包括序列处理模块,对对象的多个实例进行 序列化处理,获得每个实例的字节流;比较处理模块,将所述多个实例中的第一个实例的字 节流依次与其他实例的字节流进行比较,获得多个差异流;存储模块,将所述第一个实例的 字节流和所述多个差异流进行存储,以用于表示所述对象的多个实例。通过该技术方案,将 大对象处理为一个字节流和多个体积更小的差异流,就可以减少大对象的存储空间。在上述技术方案中,优选地,还包括设置模块,预置字节流格式;所述序列处理 模块根据所述字节流格式,对所述对象的多个实例进行序列化处理,获得每个实例的字节 流。
5
在上述技术方案中,优选地,所述设置模块还预置对象表和字符串表,其中,所述 对象表中记录每个对象的对象代码,所述字符串表用于存储每个对象的实例的字符串成员 以及进行哈希处理后得到的索引值;所述序列处理模块对所述每个实例进行序列化处理 时,对于所述每个实例中的值类型成员,将所述值类型成员的值写入到所述每个实例的字 节流中,对于所述每个实例中的引用类型成员,在所述对象表中存在所述引用类型成员的 引用对象的对象代码,将所述引用对象的对象代码写入所述每个实例的字节流,在所述对 象表中不存在所述引用对象的信息时,将所述引用对象写入到所述每个实例的字节流中, 并在所述对象表生成所述引用对象的代码,对于所述每个实例中的字符串类型成员,根据 所述字符串表对所述字符串成员进行哈希处理,在所述字符串表不存在该成员时,将得到 的所述字符串成员的哈希索引值及字符串成员写入所述每个实例的字节流中,反之则只在 字节流中写入哈希索引值。通过该技术方案,可以将大对象按照预先设置的字节流格式对 每一部分作相应的处理,得到所需的字节流,避免了重复记录。在上述技术方案中,优选地,所述比较模块还根据所述第一个实例的字节流和所 述多个差异流,获得所述对象的多个实例的字节流;所述序列处理模块还对所述对象的多 个实例的字节流进行反序列化处理,得到所述对象的多个实例。通过上述技术方案,可以实现一种对象存储系统,可以大大减小大对象的存储空 间,避免了对象和字符串的重复引用的问题。


图1是根据本发明的一个实施例的对象存储方法的流程图;图2是根据本发明的一个实施例的对象存储系统的框图;图3是根据本发明的一个实施例的对象存储方法的设计示意图;图4是根据本发明的一个实施例的对象存储方法中的字节流格式;图5是根据本发明的一个实施例的对象存储方法中的差异流格式;图6是根据本发明的一个实施例的对象存储方法中的两个对象;图7是根据本发明的一个实施例的对象存储方法中的映射到文件中的内容;图8是根据本发明的一个实施例的对象存储方法中的更新前的字节流内容;图9是根据本发明的一个实施例的对象存储方法中的更新后的字节流内容;以及图10是根据本发明的一个实施例的对象存储方法中的比较后得出的差异流内 容。
具体实施例方式为了能够更清楚地理解本发明的上述目的、特征和优点,下面结合附图和具体实 施方式对本发明进行进一步的详细描述。在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是,本发明还可 以采用其他不同于在此描述的其他方式来实施,因此,本发明并不限于下面公开的具体实 施例的限制。图1是根据本发明的一个实施例的对象存储方法的流程图。如图1所示,根据本发明的实施例的对象存储方法包括步骤102,对对象的多个实例进行序列化处理,获得每个实例的字节流;步骤104,将所述多个实例中的第一个实例 的字节流依次与其他实例的字节流进行比较,获得多个差异流;步骤106,将所述第一个实 例的字节流和所述多个差异流进行存储,以用于表示所述对象的多个实例。通过这样的技 术方案,将大对象处理为一个字节流和多个体积更小的差异流,就可以减少大对象的存储 空间。在上述技术方案中,还可以包括步骤101,预置字节流格式;在所述步骤102中, 根据所述字节流格式,对所述对象的多个实例进行序列化处理,获得每个实例的字节流。在上述技术方案中,在所述步骤101中,还预置对象表和字符串表,其中,所述对 象表中记录每个对象的对象代码,所述字符串表用于对每个对象的实例的字符串成员进行 哈希处理以得到索引值;在所述步骤102中,对所述每个实例进行序列化处理时,对于所述 每个实例中的值类型成员,将所述值类型成员的值写入到所述每个实例的字节流中,对于 所述每个实例中的引用类型成员,在所述对象表中存在所述引用类型成员的引用对象的对 象代码,将所述引用对象的对象代码写入所述每个实例的字节流,在所述对象表中不存在 所述引用对象的信息时,将所述引用对象写入到所述每个实例的字节流中,并在所述对象 表生成所述引用对象的代码,对于所述每个实例中的字符串类型成员,根据所述字符串表 对所述字符串成员进行哈希处理,在所述字符串表不存在该成员时,将得到的所述字符串 成员的哈希索引值及字符串成员写入所述每个实例的字节流中,反之则只在字节流中写入 哈希索引值。这样,就可以将大对象按照预先设置的字节流格式对每一部分作相应的处理, 得到所需的字节流,避免了重复记录。在上述技术方案中,每个字节流包括固定长度数据流,记录对应对象中值类型成 员的值,引用类型成员对应的固定长度的对象或对象代码;非固定长度数据流,记录所述对 应对象中引用类型成员对应的非固定长度的对象;字符串数据流,记录所述对应对象中的 字符串类型成员及其对应的索引值。在上述技术方案中,在所述步骤104中,根据所述其他实例中指定实例的字节流 中的固定长度数据流与所述第一个实例的字节流中的固定长度数据流的比较结果,所述指 定实例的字节流中的字符串数据流与所述第一个实例的字节流中的字符串数据流的比较 结果,以及所述指定实例的字节流的非固定长度数据流,得到所述指定实例的差异流。因 此,可以将字节流的各个对应部分相比较得到体积更小的差异流。在上述技术方案中,还可以包括步骤108,根据所述第一个实例的字节流和所述 多个差异流,获得所述对象的多个实例的字节流;步骤110,对所述对象的多个实例的字节 流进行反序列化处理,得到所述对象的多个实例。通过上述技术方案,可以实现一种对象存储方法,可以大大减小大对象的存储空 间,避免了对象和字符串的重复引用的问题。图2是根据本发明的一个实施例的对象存储系统的框图。如图2所示,根据本发明的实施例的对象存储系统200包括序列处理模块202, 对对象的多个实例进行序列化处理,获得每个实例的字节流;比较处理模块204,将所述多 个实例中的第一个实例的字节流依次与其他实例的字节流进行比较,获得多个差异流;存 储模块206,将所述第一个实例的字节流和所述多个差异流进行存储,以用于表示所述对象 的多个实例。通过这样的技术方案,将大对象处理为一个字节流和多个体积更小的差异流,
7就可以减少大对象的存储空间。在上述技术方案中,还可以包括设置模块,预置字节流格式;所述序列处理模块 根据所述字节流格式,对所述对象的多个实例进行序列化处理,获得每个实例的字节流。在上述技术方案中,所述设置模块还预置对象表和字符串表,其中,所述对象表中 记录每个对象的对象代码,所述字符串表用于存储每个对象的实例的字符串成员以及进行 哈希处理后得到的索引值;所述序列处理模块对所述每个实例进行序列化处理时,对于所 述每个实例中的值类型成员,将所述值类型成员的值写入到所述每个实例的字节流中,对 于所述每个实例中的引用类型成员,在所述对象表中存在所述引用类型成员的引用对象的 对象代码,将所述引用对象的对象代码写入所述每个实例的字节流,在所述对象表中不存 在所述引用对象的信息时,将所述引用对象写入到所述每个实例的字节流中,并在所述对 象表生成所述引用对象的代码,对于所述每个实例中的字符串类型成员,根据所述字符串 表对所述字符串成员进行哈希处理,在所述字符串表不存在该成员时,将得到的所述字符 串成员的哈希索引值及字符串成员写入所述每个实例的字节流中,反之则只在字节流中写 入哈希索引值。这样,就可以将大对象按照预先设置的字节流格式对每一部分作相应的处 理,得到所需的字节流,避免了重复记录。在上述技术方案中,所述比较模块还根据所述第一个实例的字节流和所述多个差 异流,获得所述对象的多个实例的字节流;所述序列处理模块还对所述对象的多个实例的 字节流进行反序列化处理,得到所述对象的多个实例。通过上述技术方案,可以实现一种对象存储方法和系统,大大减小对象的存储空 间,还避免了对象和字符串的重复引用问题。为了实现序列化和反序列化对象,本发明的技术方案提出了一种新的用于存储对 象的基于流的文件格式,这种流式文件简称为流。该格式包含了对象的所有数据以及反序 列化时需要的一些帮助信息。通过上述技术方案,可以实现一种对象存储系统,可以大大减小大对象的存储空 间,避免了对象和字符串的重复引用的问题。图3是根据本发明的一个实施例的对象存储方法的设计示意图。如图3所示,本实施中的对象存储方法的设计,主要涉及以下几部分序列化/反序列化API模块302 提供给应用程序的API接口,用来将应用程序中 的对象进行序列化/反序列化处理。序列化API提供了将应用程序中对象的成员写入字节 流中的功能,其中写入逻辑为按成员顺序依次写入,对于值(数值)类型的成员只记录具体 的值,而不加上任何关于成员类型的描述信息;对于引用(指针)类型的成员则先检索对象 表306,若对象表306中存在该对象,那么就只把对象表306返回的对象代码写入流中,否则 就将该对象加入对象表306,然后顺序处理该对象的成员;对于字符串成员则先访问字符 串表304,得到一个字符串代码,再将代码写入流中,反之将哈希索引值及字符串写入流中。 反序列化API则提供了将流中的数据依次读入对象的功能,对于值类型的成员直接从流中 读出;对于引用类型的成员则先访问对象表306,不存在就加入,存在就直接取得对象;字 符串成员则通过以字符串代码访问字符串表304得到字符串。字符串表304 —个实现了哈希算法的字符串集合。在序列化过程中,当遇到字符 串资源的时候,将对该字符串进行哈希,将哈希后得到的索引值作为该字符串的代码写入流中,然后将字符串按索引顺序写入字符串流中;在反序列化的过程中,先通过读取字符串 数据流以便从中构造自身,然后当应用程序调用反序列化API从流中读取字符串代码时, 将代码作为索引值返回字符串。对象表306 —个对象映射表。其内部维护一个自增计数器,当一个对象第一次出 现时,计数器自增,并作为该对象的代码。在序列化过程中,当对象重复出现时(即多次引 用),将该代码写入流中;在反序列化过程中,当对象重复出现时,直接返回已读出的对象, 而不再读取流中的数据。字节流对象308和差异流对象310 字节流对象308即为本发明的技术方案提出 的存储对象的以字节流作为持久化格式的具体实现,而差异流对象310则是一个对象的两 个不同实例的字节流的差异的实现。其中,对采用字节流对象308和差异流对象310的原因说明如下针对发明背景中提出的连续更新的场景中,比如,设某个对象为S,一共被更新了 η次,则每次被更新后的对象为Sl,S2, ... , Sn,设At为S每次变化的差异,则有=S2-S1 = At1, S3-S2 = At2, ... , Sn-Slri = Δ V1,通过归纳可以得出
η-1Sn = S1 +^Atj
= 从以上可以得知只要计算了每次对象变化的差异,那么只需要存储对象序列化 后第一次完整的字节流,后续变化则只存储差异即可,若能令At足够小,按照二八法则, 变化的部分总是要远少于不变的部分,这样就可以从总体上减少了字节流所占的磁盘空 间。需要说明的是,基于转换效率的考虑,该方法也可以表示为另一变种,即s2,...,
Sn°每次只和S1比较得出差异Δ tn,即sn = S1+Atntj这样的话就只需要比较一次差异。下面说明字节流对象308采用的字节流的格式,如图4所示a)标头,其值固定为{0x4e,0x58,0x33,0x57,0x39,0x39},长度为 6Byte,通过该 标头可区分流格式。b)对象计数,表明该流中所记录的对象的总数,长度为2Byte。c)非固定长度数据流偏移值,记录了非固定长度数据流在流中的偏移值,长度为 8Byte。d)字符串数据流偏移值,记录了字符串数据流在流中的偏移值,长度为8Byte。e)固定长度数据流,记录了所有对象中固定长度成员的数据,比如数值类型等,长 度为非固定长度数据流偏移值减去34Byte。f)非固定长度数据流,记录了所有对象中非固定长度成员的数据,比如变长的数 组类型,可为空的对象引用等,长度为字符串数据流偏移值减去非固定长度数据流偏移值。g)字符串数据流,记录了所有对象包含的字符串资源,按照字符串表中索引值的 顺序依次写入。长度为流的长度减去字符串数据流偏移值。接下来说明差异流的格式,如图5所示
9
a)标头,其值固定为{0x44,0x69,0x66,0x66,0x65,0x72,0x65,0x6e,0x63, 0x65},长度为lOByte,通过该标头可区分流格式。b)非固定流偏移值,记录了非固定长度数据流在流中的偏移值,长度为4Byte。c)字符串比较流偏移值,记录了字符串比较流在流中的偏移值,长度为8Byte。d)固定长度比较流,记录了对象变化过程中固定大小的成员之间的差异数据,具 体算法为参与比较的两个字节流的固定长度数据流做二进制异或(XOR),长度为非固定流 偏移值减去22Byte。e)非固定长度数据流,记录了比较对象中被比较的非固定长度成员的数据,长度 为字符串比较流偏移值减去非固定流偏移值。f)字符串比较流,记录了比较对象之间字符串资源的差异数据,具体算法为通过 比较两个字符串数据流,如果存在相同的字符串,则在流中写入该字符串的索引值,否则写 入字符串,长度为流的长度减去字符串比较流偏。通过上述技术方案,大大减小了对象的存储空间,避免带入过多的元数据信息,还 避免了对象和字符串的重复引用问题。下面结合例子进一步详细说明本发明的技术方案,图6是根据本发明的一个实施 例的对象存储方法中的两个对象。可以看出图6中SampleClass和ChildClass通过属性child和parent相互引用, 其中SampleClass包含了一个nullVal属性,该属性可能在对象的变化周期中有特定的值 也可能没有,没有时表示为NULL;而ChildClass则包含了一个StrVal的值,指向一个字符 串资源。那么经过序列化API对SampleClass进行编码后,则映射到文件中的字节流为如图 7所示,从图7中可知,首先,第一个写入的是SampleClass的ClassCode,ClassCode是对 象的一个代码,可以在反序列化时通过此代码创建对象,占用1个Byte ;其中,SampleClass 和ChildClass所有具有固定长度的成员都被写入到固定长度数据流中,如值类型,并且所 占长度就是该成员自身的数据类型在操作系统中实际所占的字节数;其中SampleClass的 成员nullVal被写入了非固定长度数据流区域,是因为该成员可能指向一个具体的对象, 也可能为NULL ;child成员引用了 ChildClass对象,在本实施例中由于是第一次出现,所 以先写入ChildClass的ClassCode,然后再将ChildClass的成员依次写入流中,并将其 加入到对象表中;ChildClass对象中的StrVal成员指向了一个字符串,所以先加入字符 串表中,然后将字符串表返回的代码pstr记录到流中,占用2个Byte ;parent成员引用了 SampleClass对象,由于该对象第一次写入流中时已被加入到对象表中,所以通过对象表返 回一个对象代码,再将其写入流中即可,占用2个Byte ;最后,将字符串表按照索引值的顺 序写入到字符数据流区域。同理,在反序列化时,反序列化API先通过ClassCode先构造 SampleClass对象,然后加入对象表,这时所有对象的成员的值在内存中都是零或者无效地 址;接着反序列化API从流中依次读取数据。其中,当读完IngVal的值后,反序列化API将 从非固定长度数据流中读取nullVal的值,接着构造ChildClass对象,加入对象表,然后继 续在固定长度数据流中读取fIoatVal的值;当读取pstr时,将pstr作为代码访问字符串 表,获取字符串,然后赋值给strVal成员;读取parent成员时,发现是引用类型,则访问对 象表,获得SimpleClass的引用,赋值给parent成员。至此,该实施例完整地描述了一个对象的序列化和反序列化的过程。接下来,我们
10继续描述如何通过本发明的技术方案来解决对象在连续更新时的持久化方法根据所描述的差异流算法,如果一个对象在连续更新的场景下,我们只需要存储 对象变化的差异,也就是本发明的实施例中提出的差异流对象。说明存储一个差异流要比 一个完整的字节流更好,依然使用上面的例子来进行说明。假设通过一次更新,SampleClass对象成员iVal被改变了,而其他的成员没有变 化,如图8、图9和图10所示,将更新前的字节流如图8与更新后的字节流如图9进行比较, 得到图10所示的差异流结构。具体地按照比较算法,固定长度数据流按位做异或,由于只 有成员iVal变化了,所以除了 iVal的区域,其他位全部为零;非固定长度数据流不参与比 较,这也是本发明的技术方案为什么要划分固定和非固定区域的原因,很显然如果有一个 成员的长度不固定,那么基于按位比较的算法,该成员的长度变化将使后面的成员所处的 位置发生位移,致使后面的数据比较失败;字符数据流的比较则以代码代替了相同的字符 串。同理,在反序列化前,差异流和第一个字节流的固定长度数据流做按位异或即可得到第 二个字节流的固定长度数据流,非固定长度数据流不变,字符串数据流则按代码,也就是第 一个字符串数据流中的顺序号,取得字符串替换即可,这样就得到第二个完整的字节流,然 后进行反序列化处理即可。在此需要说明的是,本发明的技术方案不只是局限于大对象的持久化,适用于所 有面向对象编程(OOP)技术中的对象概念。通过上述技术方案,可以实现一种对象存储方法和系统,其具有以下显著优点1.大大减小了大对象序列化后的空间占用。本发明的技术方案中按顺序依次写入和依次读取技术,避免了带入过多的元数据 信息进入存储流中,特别是对成员比较多,引用子对象特别复杂的大对象,效果特别明显。2.采用对象表和字符串表避免了对象和字符串的重复引用问题。利用对象表和字符串表保证一个对象或字符串在序列化后只会存储一次,节省了 时间和空间。3.通过差异流的方法大大减少了对象连续更新场景下的总体存储空间成本。利用本发明的技术方案的差异比较及存储方法,由于零串不需要存储,只需要存 储非零的区域,或者将整个流压缩后存储,连续的零串压缩比非常高,这样的话根据字节流 算法的描述可以得出总存储大小T
E3—1T= S1 十 $ ^ti
i=l相比在Δ t足够小的情况下是远远小于非差异化总存储大小
τιT = [Si这样就极大地节省了总体存储空间。以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技 术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修 改、等同替换、改进等,均应包含在本发明的保护范围之内。
1权利要求
一种对象存储方法,其特征在于,包括步骤102,对对象的多个实例进行序列化处理,获得每个实例的字节流;步骤104,将所述多个实例中的第一个实例的字节流依次与其他实例的字节流进行比较,获得多个差异流;步骤106,将所述第一个实例的字节流和所述多个差异流进行存储,以用于表示所述对象的多个实例。
2.根据权利要求1所述的对象存储方法,其特征在于,包括步骤101,预置字节流格式;在所述步骤102中,根据所述字节流格式,对所述对象的多个实例进行序列化处理,获 得每个实例的字节流。
3.根据权利要求2所述的对象存储方法,其特征在于,在所述步骤101中,还预置对象 表和字符串表,其中,所述对象表中记录每个对象的对象代码,所述字符串表用于对每个对象的实例 的字符串成员进行哈希处理以得到哈希索引值;在所述步骤102中,对所述每个实例进行序列化处理时,对于所述每个实例中的值类 型成员,将所述值类型成员的值写入到所述每个实例的字节流中,对于所述每个实例中的引用类型成员,在所述对象表中存在所述引用类型成员的引用 对象的对象代码,将所述引用对象的对象代码写入所述每个实例的字节流,在所述对象表 中不存在所述引用对象的信息时,将所述引用对象写入到所述每个实例的字节流中,并在 所述对象表生成所述弓I用对象的代码,对于所述每个实例中的字符串类型成员,根据所述字符串表对所述字符串成员进行哈 希处理,在所述字符串表中不存在所述字符串成员时,将得到的所述字符串成员的哈希索 引值及所述字符串成员写入所述每个实例的字节流中,在所述字符串表中存在所述字符串 成员时,只在字节流中写入所述字符串成员的哈希索引值。
4.根据权利要求3所述的对象存储方法,其特征在于,每个字节流包括固定长度数据流,记录对应对象中值类型成员的值,引用类型成员对应的固定长度的 对象或对象代码;非固定长度数据流,记录所述对应对象中引用类型成员对应的非固定长度的对象;字符串数据流,记录所述对应对象中的字符串类型成员及所述字符串成员对应的哈希 索引值。
5.根据权利要求4所述的对象存储方法,其特征在于,在所述步骤104中,根据所述其 他实例中指定实例的字节流中的固定长度数据流与所述第一个实例的字节流中的固定长 度数据流的比较结果,所述指定实例的字节流中的字符串数据流与所述第一个实例的字节 流中的字符串数据流的比较结果,以及所述指定实例的字节流的非固定长度数据流,得到 所述指定实例的差异流。
6.根据权利要求1至5中任一项所述的对象存储方法,其特征在于,还包括步骤108,根据所述第一个实例的字节流和所述多个差异流,获得所述对象的多个实例 的字节流;步骤110,对所述对象的多个实例的字节流进行反序列化处理,得到所述对象的多个实例。
7.一种对象存储系统,其特征在于,包括序列处理模块,对对象的多个实例进行序列化处理,获得每个实例的字节流;比较处理模块,将所述多个实例中的第一个实例的字节流依次与其他实例的字节流进 行比较,获得多个差异流;存储模块,将所述第一个实例的字节流和所述多个差异流进行存储,以用于表示所述 对象的多个实例。
8.根据权利要求7所述的对象存储系统,其特征在于,还包括设置模块,预置字节流格式;所述序列处理模块根据所述字节流格式,对所述对象的多个实例进行序列化处理,获 得每个实例的字节流。
9.根据权利要求8所述的对象存储系统,其特征在于,所述设置模块还预置对象表和 字符串表,其中,所述对象表中记录每个对象的对象代码,所述字符串表用于存储每个对象的实 例的字符串成员以及对所述字符串成员进行哈希处理后得到的哈希索引值;所述序列处理模块对所述每个实例进行序列化处理时,对于所述每个实例中的值类型 成员,将所述值类型成员的值写入到所述每个实例的字节流中,对于所述每个实例中的引用类型成员,在所述对象表中存在所述引用类型成员的引用 对象的对象代码,将所述引用对象的对象代码写入所述每个实例的字节流,在所述对象表 中不存在所述引用对象的信息时,将所述引用对象写入到所述每个实例的字节流中,并在 所述对象表生成所述弓I用对象的代码,对于所述每个实例中的字符串类型成员,根据所述字符串表对所述字符串成员进行哈 希处理,在所述字符串表中不存在所述字符串成员时,将得到的所述字符串成员的哈希索 引值及所述字符串成员写入所述每个实例的字节流中,在所述字符串表中存在所述字符串 成员时,则只在所述每个实例的字节流中写入所述字符串成员的哈希索引值。
10.根据权利要求7至9中任一项所述的对象存储系统,其特征在于,所述比较模块还 根据所述第一个实例的字节流和所述多个差异流,获得所述对象的多个实例的字节流;所述序列处理模块还对所述对象的多个实例的字节流进行反序列化处理,得到所述对 象的多个实例。
全文摘要
本发明提供了一种对象存储方法,包括步骤102,对对象的多个实例进行序列化处理,获得每个实例的字节流;步骤104,将所述多个实例中的第一个实例的字节流依次与其他实例的字节流进行比较,获得多个差异流;步骤106,将所述第一个实例的字节流和所述多个差异流进行存储,以用于表示所述对象的多个实例。本发明还提供了一种对象存储系统。根据本发明的技术方案,可以实现一种对象存储方法和系统,可以大大减小大对象的存储空间,避免了对象和字符串的重复引用的问题。
文档编号G06F17/30GK101963944SQ20101050418
公开日2011年2月2日 申请日期2010年9月30日 优先权日2010年9月30日
发明者王昊沙 申请人:用友软件股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1