CN101963944A - 对象存储方法和系统 - Google Patents

对象存储方法和系统 Download PDF

Info

Publication number
CN101963944A
CN101963944A CN2010105041851A CN201010504185A CN101963944A CN 101963944 A CN101963944 A CN 101963944A CN 2010105041851 A CN2010105041851 A CN 2010105041851A CN 201010504185 A CN201010504185 A CN 201010504185A CN 101963944 A CN101963944 A CN 101963944A
Authority
CN
China
Prior art keywords
byte stream
stream
character string
examples
byte
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.)
Granted
Application number
CN2010105041851A
Other languages
English (en)
Other versions
CN101963944B (zh
Inventor
王昊沙
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Yonyou Network Technology Co Ltd
Original Assignee
Yonyou Software Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Yonyou Software Co Ltd filed Critical Yonyou Software Co Ltd
Priority to CN201010504185.1A priority Critical patent/CN101963944B/zh
Publication of CN101963944A publication Critical patent/CN101963944A/zh
Application granted granted Critical
Publication of CN101963944B publication Critical patent/CN101963944B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明提供了一种对象存储方法,包括:步骤102,对对象的多个实例进行序列化处理,获得每个实例的字节流;步骤104,将所述多个实例中的第一个实例的字节流依次与其他实例的字节流进行比较,获得多个差异流;步骤106,将所述第一个实例的字节流和所述多个差异流进行存储,以用于表示所述对象的多个实例。本发明还提供了一种对象存储系统。根据本发明的技术方案,可以实现一种对象存储方法和系统,可以大大减小大对象的存储空间,避免了对象和字符串的重复引用的问题。

Description

对象存储方法和系统
技术领域
本发明涉及数据存储技术,尤其涉及对象存储方法和系统。
背景技术
在面向对象的编程(OOP)领域中,经常需要将内存中的对象(Object)持久化到磁盘中进行存储,这个过程一般分为两个部分:首先将内存中的对象进行编码,也就是将内存中的数据编码为字节流,这个过程一般被称为序列化,然后将序列化后得出的字节流持久化存储到磁盘的文件中。反之,从磁盘上的文件中读取字节流,然后将字节流转化为内存中的对象的过程一般被称为反序列化。
在不同的程序语言平台上,如目前主流的JAVA和DotNet平台,都有关于序列化和反序列化方法的实现,它们都通过提供一个标准接口,将用户的对象进行序列化和反序列化,这其中最重要的过程是将内存中的对象转化为字节流的过程及其反转换过程,以上两个平台提供的标准接口在转换字节流的过程中,会将对象的类型信息(Class Type),对象的成员的数据类型(Data Type),对象的数据(Data)以及其他一些控制信息写入到字节流中,这其中除了数据本身以外,其他的信息都是为了在反序列化过程中重新在内存中构造对象(我们可以将这些信息称为元数据),然后再将数据赋值到对象,从而完成整个反序列化过程。
上述这种方法在持久化一些大型对象,如数十KB大小的对象时,会带来一些额外的空间开销:我们知道,在内存中对象的大小,如果是使用C语言,可以用sizeof()求得,具体的计算方式为从第一个成员所占的字节数一直累加到最后一个成员(根据平台或编译设置的不同还会有大小不一样的对齐字节),实际上并不包含任何类型信息,这样求出的大小就大概等于字节流中对象的数据的大小,假设该对象的成员比较多,特别是还有成员引用其他对象的情况,那么序列化后对应的非数据信息,也就是元数据也会很多,某些情况下,该部分甚至超过了对象数据的本身。另外,我们再来看一种情况,如果我们需要连续的更新一个大对象,并且还要存储该对象上一次的状态(历史数据),换句话说我们更新n次,就会存储n个字节流,每个字节流的大小都会有差不多的大小,但实际上每次更新对象只是改变了很少的几个成员。如果应用场景对存储空间有比较严格的要求,那么在上述的两种情况下,字节流将会占用很大的磁盘存储空间。
因此,需要一种对象存储方式,来解决大对象占用很大存储空间的问题,将大对象持久化,节省时间和存储成本。
发明内容
鉴于以上,本发明的技术方案所要解决的技术问题在于,提供一种对象存储方法和系统,来解决大对象占用很大存储空间的问题,将大对象持久化,节省时间和存储成本。
本发明提供了一种对象存储方法,包括:步骤102,对对象的多个实例进行序列化处理,获得每个实例的字节流;步骤104,将所述多个实例中的第一个实例的字节流依次与其他实例的字节流进行比较,获得多个差异流;步骤106,将所述第一个实例的字节流和所述多个差异流进行存储,以用于表示所述对象的多个实例。通过该技术方案,将大对象处理为一个字节流和多个体积更小的差异流,就可以减少大对象的存储空间。
在上述技术方案中,优选地,包括:步骤101,预置字节流格式;在所述步骤102中,根据所述字节流格式,对所述对象的多个实例进行序列化处理,获得每个实例的字节流。
在上述技术方案中,优选地,在所述步骤101中,还预置对象表和字符串表,其中,所述对象表中记录每个对象的对象代码,所述字符串表用于对每个对象的实例的字符串成员进行哈希处理以得到索引值;在所述步骤102中,对所述每个实例进行序列化处理时,对于所述每个实例中的值类型成员,将所述值类型成员的值写入到所述每个实例的字节流中,对于所述每个实例中的引用类型成员,在所述对象表中存在所述引用类型成员的引用对象的对象代码,将所述引用对象的对象代码写入所述每个实例的字节流,在所述对象表中不存在所述引用对象的信息时,将所述引用对象写入到所述每个实例的字节流中,并在所述对象表生成所述引用对象的代码,对于所述每个实例中的字符串类型成员,根据所述字符串表对所述字符串成员进行哈希处理,在所述字符串表不存在该成员时,将得到的所述字符串成员的哈希索引值及字符串成员写入所述每个实例的字节流中,反之则只在字节流中写入哈希索引值。通过该技术方案,可以将大对象按照预先设置的字节流格式对每一部分作相应的处理,得到所需的字节流,避免了重复记录。
在上述技术方案中,优选地,每个字节流包括:固定长度数据流,记录对应对象中值类型成员的值,引用类型成员对应的固定长度的对象或对象代码;非固定长度数据流,记录所述对应对象中引用类型成员对应的非固定长度的对象;字符串数据流,记录所述对应对象中的字符串类型成员和其对应的哈希索引值。
在上述技术方案中,优选地,在所述步骤104中,根据所述其他实例中指定实例的字节流中的固定长度数据流与所述第一个实例的字节流中的固定长度数据流的比较结果,所述指定实例的字节流中的字符串数据流与所述第一个实例的字节流中的字符串数据流的比较结果,以及所述指定实例的字节流的非固定长度数据流,得到所述指定实例的差异流。通过该技术方案,将字节流的各个对应部分相比较得到体积更小的差异流。
在上述技术方案中,优选地,还包括:步骤108,根据所述第一个实例的字节流和所述多个差异流,获得所述对象的多个实例的字节流;步骤110,对所述对象的多个实例的字节流进行反序列化处理,得到所述对象的多个实例。
通过上述技术方案,可以实现一种对象存储方法,可以大大减小大对象的存储空间,避免了对象和字符串的重复引用的问题。
本发明还提供了一种对象存储系统,包括:序列处理模块,对对象的多个实例进行序列化处理,获得每个实例的字节流;比较处理模块,将所述多个实例中的第一个实例的字节流依次与其他实例的字节流进行比较,获得多个差异流;存储模块,将所述第一个实例的字节流和所述多个差异流进行存储,以用于表示所述对象的多个实例。通过该技术方案,将大对象处理为一个字节流和多个体积更小的差异流,就可以减少大对象的存储空间。
在上述技术方案中,优选地,还包括:设置模块,预置字节流格式;所述序列处理模块根据所述字节流格式,对所述对象的多个实例进行序列化处理,获得每个实例的字节流。
在上述技术方案中,优选地,所述设置模块还预置对象表和字符串表,其中,所述对象表中记录每个对象的对象代码,所述字符串表用于存储每个对象的实例的字符串成员以及进行哈希处理后得到的索引值;所述序列处理模块对所述每个实例进行序列化处理时,对于所述每个实例中的值类型成员,将所述值类型成员的值写入到所述每个实例的字节流中,对于所述每个实例中的引用类型成员,在所述对象表中存在所述引用类型成员的引用对象的对象代码,将所述引用对象的对象代码写入所述每个实例的字节流,在所述对象表中不存在所述引用对象的信息时,将所述引用对象写入到所述每个实例的字节流中,并在所述对象表生成所述引用对象的代码,对于所述每个实例中的字符串类型成员,根据所述字符串表对所述字符串成员进行哈希处理,在所述字符串表不存在该成员时,将得到的所述字符串成员的哈希索引值及字符串成员写入所述每个实例的字节流中,反之则只在字节流中写入哈希索引值。通过该技术方案,可以将大对象按照预先设置的字节流格式对每一部分作相应的处理,得到所需的字节流,避免了重复记录。
在上述技术方案中,优选地,所述比较模块还根据所述第一个实例的字节流和所述多个差异流,获得所述对象的多个实例的字节流;所述序列处理模块还对所述对象的多个实例的字节流进行反序列化处理,得到所述对象的多个实例。
通过上述技术方案,可以实现一种对象存储系统,可以大大减小大对象的存储空间,避免了对象和字符串的重复引用的问题。
附图说明
图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,将所述第一个实例的字节流和所述多个差异流进行存储,以用于表示所述对象的多个实例。通过这样的技术方案,将大对象处理为一个字节流和多个体积更小的差异流,就可以减少大对象的存储空间。
在上述技术方案中,还可以包括:设置模块,预置字节流格式;所述序列处理模块根据所述字节流格式,对所述对象的多个实例进行序列化处理,获得每个实例的字节流。
在上述技术方案中,所述设置模块还预置对象表和字符串表,其中,所述对象表中记录每个对象的对象代码,所述字符串表用于存储每个对象的实例的字符串成员以及进行哈希处理后得到的索引值;所述序列处理模块对所述每个实例进行序列化处理时,对于所述每个实例中的值类型成员,将所述值类型成员的值写入到所述每个实例的字节流中,对于所述每个实例中的引用类型成员,在所述对象表中存在所述引用类型成员的引用对象的对象代码,将所述引用对象的对象代码写入所述每个实例的字节流,在所述对象表中不存在所述引用对象的信息时,将所述引用对象写入到所述每个实例的字节流中,并在所述对象表生成所述引用对象的代码,对于所述每个实例中的字符串类型成员,根据所述字符串表对所述字符串成员进行哈希处理,在所述字符串表不存在该成员时,将得到的所述字符串成员的哈希索引值及字符串成员写入所述每个实例的字节流中,反之则只在字节流中写入哈希索引值。这样,就可以将大对象按照预先设置的字节流格式对每一部分作相应的处理,得到所需的字节流,避免了重复记录。
在上述技术方案中,所述比较模块还根据所述第一个实例的字节流和所述多个差异流,获得所述对象的多个实例的字节流;所述序列处理模块还对所述对象的多个实例的字节流进行反序列化处理,得到所述对象的多个实例。
通过上述技术方案,可以实现一种对象存储方法和系统,大大减小对象的存储空间,还避免了对象和字符串的重复引用问题。
为了实现序列化和反序列化对象,本发明的技术方案提出了一种新的用于存储对象的基于流的文件格式,这种流式文件简称为流。该格式包含了对象的所有数据以及反序列化时需要的一些帮助信息。
通过上述技术方案,可以实现一种对象存储系统,可以大大减小大对象的存储空间,避免了对象和字符串的重复引用的问题。
图3是根据本发明的一个实施例的对象存储方法的设计示意图。
如图3所示,本实施中的对象存储方法的设计,主要涉及以下几部分:
序列化/反序列化API模块302:提供给应用程序的API接口,用来将应用程序中的对象进行序列化/反序列化处理。序列化API提供了将应用程序中对象的成员写入字节流中的功能,其中写入逻辑为按成员顺序依次写入,对于值(数值)类型的成员只记录具体的值,而不加上任何关于成员类型的描述信息;对于引用(指针)类型的成员则先检索对象表306,若对象表306中存在该对象,那么就只把对象表306返回的对象代码写入流中,否则就将该对象加入对象表306,然后顺序处理该对象的成员;对于字符串成员则先访问字符串表304,得到一个字符串代码,再将代码写入流中,反之将哈希索引值及字符串写入流中。反序列化API则提供了将流中的数据依次读入对象的功能,对于值类型的成员直接从流中读出;对于引用类型的成员则先访问对象表306,不存在就加入,存在就直接取得对象;字符串成员则通过以字符串代码访问字符串表304得到字符串。
字符串表304:一个实现了哈希算法的字符串集合。在序列化过程中,当遇到字符串资源的时候,将对该字符串进行哈希,将哈希后得到的索引值作为该字符串的代码写入流中,然后将字符串按索引顺序写入字符串流中;在反序列化的过程中,先通过读取字符串数据流以便从中构造自身,然后当应用程序调用反序列化API从流中读取字符串代码时,将代码作为索引值返回字符串。
对象表306:一个对象映射表。其内部维护一个自增计数器,当一个对象第一次出现时,计数器自增,并作为该对象的代码。在序列化过程中,当对象重复出现时(即多次引用),将该代码写入流中;在反序列化过程中,当对象重复出现时,直接返回已读出的对象,而不再读取流中的数据。
字节流对象308和差异流对象310:字节流对象308即为本发明的技术方案提出的存储对象的以字节流作为持久化格式的具体实现,而差异流对象310则是一个对象的两个不同实例的字节流的差异的实现。
其中,对采用字节流对象308和差异流对象310的原因说明如下:
针对发明背景中提出的连续更新的场景中,比如,设某个对象为S,一共被更新了n次,则每次被更新后的对象为s1,s2,...,sn,设Δt为S每次变化的差异,则有:s2-s1=Δt1,s3-s2=Δt2,...,sn-sn-1=Δtn-1,通过归纳可以得出:
S n = S 1 + Σ i = 1 n - 1 Δ t i .
从以上可以得知:只要计算了每次对象变化的差异,那么只需要存储对象序列化后第一次完整的字节流,后续变化则只存储差异即可,若能令Δt足够小,按照二八法则,变化的部分总是要远少于不变的部分,这样就可以从总体上减少了字节流所占的磁盘空间。
需要说明的是,基于转换效率的考虑,该方法也可以表示为另一变种,即s2,...,sn
每次只和s1比较得出差异Δtn,即:sn=s1+Δtn
这样的话就只需要比较一次差异。
下面说明字节流对象308采用的字节流的格式,如图4所示:
a)标头,其值固定为{0x4e,0x58,0x33,0x57,0x39,0x39},长度为6Byte,通过该标头可区分流格式。
b)对象计数,表明该流中所记录的对象的总数,长度为2Byte。
c)非固定长度数据流偏移值,记录了非固定长度数据流在流中的偏移值,长度为8Byte。
d)字符串数据流偏移值,记录了字符串数据流在流中的偏移值,长度为8Byte。
e)固定长度数据流,记录了所有对象中固定长度成员的数据,比如数值类型等,长度为非固定长度数据流偏移值减去34Byte。
f)非固定长度数据流,记录了所有对象中非固定长度成员的数据,比如变长的数组类型,可为空的对象引用等,长度为字符串数据流偏移值减去非固定长度数据流偏移值。
g)字符串数据流,记录了所有对象包含的字符串资源,按照字符串表中索引值的顺序依次写入。长度为流的长度减去字符串数据流偏移值。
接下来说明差异流的格式,如图5所示:
a)标头,其值固定为{0x44,0x69,0x66,0x66,0x65,0x72,0x65,0x6e,0x63,0x65},长度为10Byte,通过该标头可区分流格式。
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从流中依次读取数据。其中,当读完lngVal的值后,反序列化API将从非固定长度数据流中读取nullVal的值,接着构造ChildClass对象,加入对象表,然后继续在固定长度数据流中读取floatVal的值;当读取pstr时,将pstr作为代码访问字符串表,获取字符串,然后赋值给strVal成员;读取parent成员时,发现是引用类型,则访问对象表,获得SimpleClass的引用,赋值给parent成员。
至此,该实施例完整地描述了一个对象的序列化和反序列化的过程。接下来,我们继续描述如何通过本发明的技术方案来解决对象在连续更新时的持久化方法:
根据所描述的差异流算法,如果一个对象在连续更新的场景下,我们只需要存储对象变化的差异,也就是本发明的实施例中提出的差异流对象。说明存储一个差异流要比一个完整的字节流更好,依然使用上面的例子来进行说明。
假设通过一次更新,SampleClass对象成员iVal被改变了,而其他的成员没有变化,如图8、图9和图10所示,将更新前的字节流如图8与更新后的字节流如图9进行比较,得到图10所示的差异流结构。具体地按照比较算法,固定长度数据流按位做异或,由于只有成员iVal变化了,所以除了iVal的区域,其他位全部为零;非固定长度数据流不参与比较,这也是本发明的技术方案为什么要划分固定和非固定区域的原因,很显然如果有一个成员的长度不固定,那么基于按位比较的算法,该成员的长度变化将使后面的成员所处的位置发生位移,致使后面的数据比较失败;字符数据流的比较则以代码代替了相同的字符串。同理,在反序列化前,差异流和第一个字节流的固定长度数据流做按位异或即可得到第二个字节流的固定长度数据流,非固定长度数据流不变,字符串数据流则按代码,也就是第一个字符串数据流中的顺序号,取得字符串替换即可,这样就得到第二个完整的字节流,然后进行反序列化处理即可。
在此需要说明的是,本发明的技术方案不只是局限于大对象的持久化,适用于所有面向对象编程(OOP)技术中的对象概念。
通过上述技术方案,可以实现一种对象存储方法和系统,其具有以下显著优点:
1.大大减小了大对象序列化后的空间占用。
本发明的技术方案中按顺序依次写入和依次读取技术,避免了带入过多的元数据信息进入存储流中,特别是对成员比较多,引用子对象特别复杂的大对象,效果特别明显。
2.采用对象表和字符串表避免了对象和字符串的重复引用问题。
利用对象表和字符串表保证一个对象或字符串在序列化后只会存储一次,节省了时间和空间。
3.通过差异流的方法大大减少了对象连续更新场景下的总体存储空间成本。
利用本发明的技术方案的差异比较及存储方法,由于零串不需要存储,只需要存储非零的区域,或者将整个流压缩后存储,连续的零串压缩比非常高,这样的话根据字节流算法的描述可以得出总存储大小T:
T = S 1 + Σ i = 1 n - 1 Δ t i
相比在Δt足够小的情况下是远远小于非差异化总存储大小:
T = Σ i = 1 n S i
这样就极大地节省了总体存储空间。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (10)

1.一种对象存储方法,其特征在于,包括:
步骤102,对对象的多个实例进行序列化处理,获得每个实例的字节流;
步骤104,将所述多个实例中的第一个实例的字节流依次与其他实例的字节流进行比较,获得多个差异流;
步骤106,将所述第一个实例的字节流和所述多个差异流进行存储,以用于表示所述对象的多个实例。
2.根据权利要求1所述的对象存储方法,其特征在于,包括:
步骤101,预置字节流格式;
在所述步骤102中,根据所述字节流格式,对所述对象的多个实例进行序列化处理,获得每个实例的字节流。
3.根据权利要求2所述的对象存储方法,其特征在于,在所述步骤101中,还预置对象表和字符串表,
其中,所述对象表中记录每个对象的对象代码,所述字符串表用于对每个对象的实例的字符串成员进行哈希处理以得到哈希索引值;
在所述步骤102中,对所述每个实例进行序列化处理时,对于所述每个实例中的值类型成员,将所述值类型成员的值写入到所述每个实例的字节流中,
对于所述每个实例中的引用类型成员,在所述对象表中存在所述引用类型成员的引用对象的对象代码,将所述引用对象的对象代码写入所述每个实例的字节流,在所述对象表中不存在所述引用对象的信息时,将所述引用对象写入到所述每个实例的字节流中,并在所述对象表生成所述引用对象的代码,
对于所述每个实例中的字符串类型成员,根据所述字符串表对所述字符串成员进行哈希处理,在所述字符串表中不存在所述字符串成员时,将得到的所述字符串成员的哈希索引值及所述字符串成员写入所述每个实例的字节流中,在所述字符串表中存在所述字符串成员时,只在字节流中写入所述字符串成员的哈希索引值。
4.根据权利要求3所述的对象存储方法,其特征在于,每个字节流包括:
固定长度数据流,记录对应对象中值类型成员的值,引用类型成员对应的固定长度的对象或对象代码;
非固定长度数据流,记录所述对应对象中引用类型成员对应的非固定长度的对象;
字符串数据流,记录所述对应对象中的字符串类型成员及所述字符串成员对应的哈希索引值。
5.根据权利要求4所述的对象存储方法,其特征在于,在所述步骤104中,根据所述其他实例中指定实例的字节流中的固定长度数据流与所述第一个实例的字节流中的固定长度数据流的比较结果,所述指定实例的字节流中的字符串数据流与所述第一个实例的字节流中的字符串数据流的比较结果,以及所述指定实例的字节流的非固定长度数据流,得到所述指定实例的差异流。
6.根据权利要求1至5中任一项所述的对象存储方法,其特征在于,还包括:
步骤108,根据所述第一个实例的字节流和所述多个差异流,获得所述对象的多个实例的字节流;
步骤110,对所述对象的多个实例的字节流进行反序列化处理,得到所述对象的多个实例。
7.一种对象存储系统,其特征在于,包括:
序列处理模块,对对象的多个实例进行序列化处理,获得每个实例的字节流;
比较处理模块,将所述多个实例中的第一个实例的字节流依次与其他实例的字节流进行比较,获得多个差异流;
存储模块,将所述第一个实例的字节流和所述多个差异流进行存储,以用于表示所述对象的多个实例。
8.根据权利要求7所述的对象存储系统,其特征在于,还包括:
设置模块,预置字节流格式;
所述序列处理模块根据所述字节流格式,对所述对象的多个实例进行序列化处理,获得每个实例的字节流。
9.根据权利要求8所述的对象存储系统,其特征在于,所述设置模块还预置对象表和字符串表,
其中,所述对象表中记录每个对象的对象代码,所述字符串表用于存储每个对象的实例的字符串成员以及对所述字符串成员进行哈希处理后得到的哈希索引值;
所述序列处理模块对所述每个实例进行序列化处理时,对于所述每个实例中的值类型成员,将所述值类型成员的值写入到所述每个实例的字节流中,
对于所述每个实例中的引用类型成员,在所述对象表中存在所述引用类型成员的引用对象的对象代码,将所述引用对象的对象代码写入所述每个实例的字节流,在所述对象表中不存在所述引用对象的信息时,将所述引用对象写入到所述每个实例的字节流中,并在所述对象表生成所述引用对象的代码,
对于所述每个实例中的字符串类型成员,根据所述字符串表对所述字符串成员进行哈希处理,在所述字符串表中不存在所述字符串成员时,将得到的所述字符串成员的哈希索引值及所述字符串成员写入所述每个实例的字节流中,在所述字符串表中存在所述字符串成员时,则只在所述每个实例的字节流中写入所述字符串成员的哈希索引值。
10.根据权利要求7至9中任一项所述的对象存储系统,其特征在于,所述比较模块还根据所述第一个实例的字节流和所述多个差异流,获得所述对象的多个实例的字节流;
所述序列处理模块还对所述对象的多个实例的字节流进行反序列化处理,得到所述对象的多个实例。
CN201010504185.1A 2010-09-30 2010-09-30 对象存储方法和系统 Active CN101963944B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201010504185.1A CN101963944B (zh) 2010-09-30 2010-09-30 对象存储方法和系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201010504185.1A CN101963944B (zh) 2010-09-30 2010-09-30 对象存储方法和系统

Publications (2)

Publication Number Publication Date
CN101963944A true CN101963944A (zh) 2011-02-02
CN101963944B CN101963944B (zh) 2015-04-15

Family

ID=43516817

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201010504185.1A Active CN101963944B (zh) 2010-09-30 2010-09-30 对象存储方法和系统

Country Status (1)

Country Link
CN (1) CN101963944B (zh)

Cited By (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2014180398A1 (zh) * 2013-12-03 2014-11-13 中兴通讯股份有限公司 数据差异分析方法及装置
CN104168306A (zh) * 2014-06-26 2014-11-26 湖北安标信息技术有限公司 基于分布式系统的配置集成方法
CN104426983A (zh) * 2013-09-05 2015-03-18 携程计算机技术(上海)有限公司 网站建设系统及方法
CN109213745A (zh) * 2018-08-27 2019-01-15 郑州云海信息技术有限公司 一种分布式文件存储方法、装置、处理器及存储介质
CN109902085A (zh) * 2019-01-11 2019-06-18 珠海金山网络游戏科技有限公司 一种配置存储结构优化方法及系统
CN110162573A (zh) * 2019-05-05 2019-08-23 中国银行股份有限公司 一种分布式序列生成方法、装置及系统
CN110716712A (zh) * 2018-07-13 2020-01-21 拜椰特(上海)软件技术有限公司 计算机编程语言用字符实现对象的方法
CN111078632A (zh) * 2019-12-27 2020-04-28 珠海金山网络游戏科技有限公司 一种文件数据的管理方法及装置
CN116126429A (zh) * 2022-12-06 2023-05-16 谷斗科技(上海)有限公司 一种非数据类型对象的引用持久化及其恢复的方法

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101364235A (zh) * 2008-09-27 2009-02-11 复旦大学 一种基于文件差异的xml文档压缩方法
CN101441582A (zh) * 2007-11-20 2009-05-27 北京和力记易科技有限公司 计算机数据对象的备份和恢复方法及实现该方法的系统和程序产品
CN101661391A (zh) * 2009-09-24 2010-03-03 金蝶软件(中国)有限公司 一种对象序列化方法、对象反序列化方法、装置及系统
CN101807207A (zh) * 2010-03-22 2010-08-18 北京大用科技有限责任公司 一种基于内容差异比较的文档共享方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101441582A (zh) * 2007-11-20 2009-05-27 北京和力记易科技有限公司 计算机数据对象的备份和恢复方法及实现该方法的系统和程序产品
CN101364235A (zh) * 2008-09-27 2009-02-11 复旦大学 一种基于文件差异的xml文档压缩方法
CN101661391A (zh) * 2009-09-24 2010-03-03 金蝶软件(中国)有限公司 一种对象序列化方法、对象反序列化方法、装置及系统
CN101807207A (zh) * 2010-03-22 2010-08-18 北京大用科技有限责任公司 一种基于内容差异比较的文档共享方法

Cited By (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104426983A (zh) * 2013-09-05 2015-03-18 携程计算机技术(上海)有限公司 网站建设系统及方法
WO2014180398A1 (zh) * 2013-12-03 2014-11-13 中兴通讯股份有限公司 数据差异分析方法及装置
CN104168306A (zh) * 2014-06-26 2014-11-26 湖北安标信息技术有限公司 基于分布式系统的配置集成方法
CN110716712A (zh) * 2018-07-13 2020-01-21 拜椰特(上海)软件技术有限公司 计算机编程语言用字符实现对象的方法
CN109213745A (zh) * 2018-08-27 2019-01-15 郑州云海信息技术有限公司 一种分布式文件存储方法、装置、处理器及存储介质
CN109213745B (zh) * 2018-08-27 2022-04-22 郑州云海信息技术有限公司 一种分布式文件存储方法、装置、处理器及存储介质
CN109902085A (zh) * 2019-01-11 2019-06-18 珠海金山网络游戏科技有限公司 一种配置存储结构优化方法及系统
CN109902085B (zh) * 2019-01-11 2023-09-08 珠海金山数字网络科技有限公司 一种配置存储结构优化方法及系统
CN110162573A (zh) * 2019-05-05 2019-08-23 中国银行股份有限公司 一种分布式序列生成方法、装置及系统
CN111078632A (zh) * 2019-12-27 2020-04-28 珠海金山网络游戏科技有限公司 一种文件数据的管理方法及装置
CN116126429A (zh) * 2022-12-06 2023-05-16 谷斗科技(上海)有限公司 一种非数据类型对象的引用持久化及其恢复的方法
CN116126429B (zh) * 2022-12-06 2023-11-17 谷斗科技(上海)有限公司 一种非数据类型对象的引用持久化及其恢复的方法

Also Published As

Publication number Publication date
CN101963944B (zh) 2015-04-15

Similar Documents

Publication Publication Date Title
CN101963944A (zh) 对象存储方法和系统
US20110283183A1 (en) Method for compressing/decompressing structured documents
US20180253478A1 (en) Method and system for parallelization of ingestion of large data sets
CN104040541A (zh) 用于更高效地使用存储器至cpu带宽的技术
CN103902544A (zh) 一种数据处理方法及系统
US11677416B2 (en) Hardware implementable data compression/decompression algorithm
CN105144157A (zh) 用于压缩数据库中的数据的系统和方法
US9065469B2 (en) Compression match enumeration
WO2017084482A1 (zh) 一种数据传输方法和装置
CN106897280A (zh) 数据查询方法及装置
CN110060158A (zh) 基于变长编码的智能合约执行方法和装置
CN102591958B (zh) 基于tcam的确定性有穷状态自动机的匹配方法和装置
CN105264488A (zh) 使用数组对来合并有序列表
CN105302915B (zh) 基于内存计算的高性能数据处理系统
US20140052710A1 (en) Device and method of mass data storage based on tree structure
CN106651972A (zh) 一种二值图像编码、解码方法及装置
CN110389953B (zh) 基于压缩图的数据存储方法、存储介质、存储装置和服务器
CN112711582A (zh) 一种数据源清洗集成化主数据管理平台
US7624326B2 (en) Encoding device and method, decoding device and method, program, and recording medium
CN102855278A (zh) 一种仿真方法和系统
CN111932265B (zh) 一种基于双层链式架构区块链的区块交易转化方法
US7313567B1 (en) Schemaless XML payload generation
Gagie On the value of multiple read/write streams for data compression
Bäuerle et al. Control improvement for jump-diffusion processes with applications to finance
CN110069258A (zh) 一种hci代码二次生成方法

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
C56 Change in the name or address of the patentee

Owner name: YONYOU NETWORK TECHNOLOGY CO., LTD.

Free format text: FORMER NAME: UFIDA SOFTWARE CO., LTD.

CP03 Change of name, title or address

Address after: 100094 Haidian District North Road, Beijing, No. 68

Patentee after: Yonyou Network Technology Co., Ltd.

Address before: 100094 Beijing city Haidian District North Road No. 68, UFIDA Software Park

Patentee before: UFIDA Software Co., Ltd.