CN107341262B - 数据库中对象类型列的序列化、反序列化方法及装置 - Google Patents
数据库中对象类型列的序列化、反序列化方法及装置 Download PDFInfo
- Publication number
- CN107341262B CN107341262B CN201710576532.3A CN201710576532A CN107341262B CN 107341262 B CN107341262 B CN 107341262B CN 201710576532 A CN201710576532 A CN 201710576532A CN 107341262 B CN107341262 B CN 107341262B
- Authority
- CN
- China
- Prior art keywords
- class
- attribute
- unique identifier
- data
- identifier
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/28—Databases characterised by their database models, e.g. relational or object models
- G06F16/284—Relational databases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/221—Column-oriented storage; Management thereof
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明实施例公开了一种数据库中对象类型列的序列化、反序列化方法及装置。其中,所述数据库中对象类型列的序列化方法包括:根据保存在数据字典中对象列的描述信息获取对象列对应的类的登记信息;根据所述登记信息对实例数据实例化,以生成对象实例;在内存中分配临时数据存储表;通过所述临时数据存储表,按照预设的格式和登记信息将所述对象实例的属性转换为相应的二进制数据;将所述二进制数据存储在对象表中。可在对对象列操作时,通过二进制数据与属性之间的转换,能够执行相应的操作。可以较小代价实现对象类型支持的扩展,并可实现所有类操作。减少了对新数据类型的维护成本,大大简化了对象类型在数据库中的存储逻辑。
Description
技术领域
本发明实施例涉及数据库技术领域,尤其涉及一种数据库中对象类型列的序列化、反序列化方法及装置。
背景技术
当前主流的数据库为关系型数据库,但对象数据库也成为数据库发展的一个趋势分支。在关系数据库中增加对象类型,使用户可以根据现实世界给对象建模,日益成为关系数据库用户的迫切需求,一些关系数据库厂商也已对此提供了支持。
目前数据库中实现对象类型主要通过增加一种“类类型”的数据类型支持来实现。对象(Object)是现实存在的描述,相当于数据库中的数据。类(Class)是现实存在的类别,是对象的抽象,类是数据库中的一种数据类型,可以由用户自定义。类类型是对象类型,其中包含属性(用于存储对象的状态)和方法(用于建立对象的行为模型)。
类类型可以作为数据库表中列的数据类型、过程化SQL语言(PLSQL)语句块中变量的数据类型及函数参数的数据类型。数据库在存储表的数据时,对单个列定义成对象类型的情况,称之为对象列,含有列对象的表称为对象表。创建类类型的对象实例称为类的实例化。
目前一些主流的关系数据库都支持对象类型的存储,基本的处理方式是:无论是在SQL语句还是在PLSQL中处理类的实例化时,都采用特定的类数据类型,生成该类型的对象数据,包含对象全部的属性和方法。在存储对象表的对象列数据时,将这个类类型的对象数据全部进行存储。
由于现有的关系数据库中进行对象数据的存储,需要增加特别的对象类型。并且,这样的对象类型区别于普通数据类型进行存储与访问,增加了数据库管理系统的实现复杂度和数据库运行时处理对象类型的代价。
发明内容
针对上述技术问题,本发明实施例提供了一种数据库中对象类型列的序列化、反序列化方法及装置,以实现在关系数据库中采用现有数据类型支持对象列的存储和操作。
第一方面,本发明实施例提供了一种数据库中对象类型列的序列化方法,所述方法包括:
根据保存在数据字典中对象列的描述信息获取对象列对应的类的登记信息;
根据所述登记信息对实例数据实例化,以生成对象实例;
在内存中分配临时数据存储表;
通过所述临时数据存储表,按照预设的格式和登记信息将所述对象实例的属性转换为相应的二进制数据;
将所述二进制数据存储在对象表中。
第二方面,本发明实施例还提供了一种数据库中对象类型列的反序列化方法,所述方法包括:
根据二进制数据判断是否为列对象序列化数据;
如果为列对象序列化数据,在内存中分配临时数据存储表;
按照预设的格式确定对象对应的类唯一标识符和类的属性个数;
在临时数据存储表中写入属性的属性值,所述属性的属性值按照预设的格式读取。
第三方面,本发明实施例还提供了一种数据库中对象类型列的序列化装置,所述装置包括:
获取模块,用于根据保存在数据字典中对象列的描述信息获取对象列对应的类的登记信息;
生成模块,用于根据所述登记信息对实例数据实例化,以生成对象实例;
分配模块,用于在内存中分配临时数据存储表;
转换模块,用于通过所述临时数据存储表,按照预设的格式和登记信息将所述对象实例的属性转换为相应的二进制数据;
存储模块,用于将所述二进制数据存储在对象表中。
第四方面,本发明实施例还提供了一种数据库中对象类型列的反序列化装置,所述装置包括:
判断模块,用于根据二进制数据判断是否为列对象序列化数据;
分配模块,用于如果为列对象序列化数据,在内存中分配临时数据存储表;
确定模块,用于按照预设的格式确定对象对应的类唯一标识符和类的属性个数;
读取模块,用于在临时数据存储表中写入属性的属性值,所述属性的属性值按照预设的格式读取。
本发明实施例提供的数据库中对象类型列的序列化、反序列化方法及装置,通过将列对象的属性转换为二进制数据,并且可在对对象列操作时,通过二进制数据与属性之间的转换,能够执行相应的操作。可以较小代价实现对象类型支持的扩展,并可实现所有类操作。减少了对新数据类型的维护成本,大大简化了对象类型在数据库中的存储逻辑。
附图说明
通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:
图1是本发明实施例一提供的对象列序列化方法的流程示意图;
图2是本发明实施例一提供的数据库中对象类型列的序列化方法中类对象序列化的格式示意图;
图3是本发明实施例一提供的数据库中对象类型列的序列化方法中对象属性为数据类型的格式示意图;
图4为本发明实施例一提供的数据库中对象类型列的序列化方法中对象属性为类类型的格式示意图;
图5为本发明实施例二提供的数据库中对象类型列的序列化方法的流程示意图;
图6是本发明实施例二提供的数据库中对象类型列的序列化方法中增加记录的标识的属性值的格式示意图;
图7是本发明实施例三提供的的数据库中对象类型列的反序列化方法的流程示意图;
图8是本发明实施例四提供的的数据库中对象类型列的反序列化方法的流程示意图;
图9是本发明实施例五提供的对象列序列化装置的结构示意图;
图10是本发明实施例六提供的对象列反序列化装置的结构示意图。
具体实施方式
下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
实施例一
本实施例提供了一种数据库中对象类型列的序列化方法。本实施例的方法可以由数据库中对象类型列的序列化装置来执行,该装置可通过硬件和/或软件的方式实现,并一般可以集成于关系数据库内。
参见图1,所述数据库中对象类型列的序列化方法,包括:
S110,根据保存在数据字典中对象列的描述信息获取对象列对应的类的登记信息。
序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。在关系数据库中,当插入类的实例数据或者修改实例数据时,由于实例数据不可直接使用,需用类创建对象。并需要将创建的对象转换为可存储的数据类型。修改实例数据可以视为先删除后插入的操作,因此,在本实施例中,修改实例数据也可视为插入实例数据的一种。通常,在插入实例数据时,需要对类进行实例化。
数据字典是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑、外部实体等进行定义和描述,其目的是对数据流程图中的各个元素做出详细的说明。数据字典由数据库系统在运行时根据数据库的对象变化自动维护。数据字典可存储字段名、数据类型、主键、外键等描述表的属性的内容。在本实施例中,在根据保存在数据字典中对象列的描述信息获取对象列对应的类的登记信息之前,还包括:在类被创建时,为所述类分配唯一标识符,并记录所述类的名称;将所述唯一标识符、类的名称和所述类的创建语句保存在数据字典中。
在数据库运行时,当一个类被创建时,通过对创建语句的分析,为该类分配一个系统的唯一标识符。示例性,可以通过类头和/或类体的创建语句确定是否为类被创建。此外,所述唯一标识符可以为ID,并将该ID和类名和所述类的创建语句一起保存在数据字典中。供后期在进行序列化时进行查找。
在数据库中创建表时,会对表中的每个列创建描述信息。对于对象列,通过解析,能够判断当前列的类型是否为数据库基本数据类型。如果不是数据库基本数据类型,将语句中的类型名与数据字典中记录的类的类名进行匹配,匹配成功说明该列为对象列,从数据字典信息中获得该类的ID。
由于数据库系统内部处理对象列时,是将其作为二进制数据处理的,因此对象类在内存中的描述结构中的类型记为二进制数据类型,为了与普通二进制数据类型列进行区分,在列描述结构中增加一个标记用于记录类的ID。并将这些描述保存在数据字典中。
登记信息可以包括:保存在数据字典中的类唯一标识符、类名称和类的创建语句;和保存在内存结构中的类唯一标识符、类名称、加密属性、继承属性、类的属性和方法信息,所述方法信息包括方法中参数的名称、长度、数据类型和方法的调用指针。
当在数据库中第一次使用一个类时,例如出现在SQL语句或PLSQL中,数据库系统可以根据类名找到之前创建这个类时存储在字典表中的信息,解析字典表中存储的类创建语句,生成一个内存结构ndct_cls_t。ndct_cls_t可以记录类的ID、类名、加密、继承属性等,同时还记录了类的属性和方法信息,例如记录每个属性的名字、长度和数据类型;以及记录每个方法,也包括构造函数的信息,示例性的,可以包括方法的方法名,方法中每个参数的名字、长度和数据类型,以及方法的调用指针。可以将上述信息以表的方式进行保存。优选的,可以采用链表方式进行保存。
S120,根据所述登记信息对所述实例数据实例化,以生成对象实例。
创建类类型的对象,即对类进行实例化都通过类的构造函数实现的。构造函数与类名相同。在实例化时,根据类名在数据结构ndct_cls_t中查找到与构造函数的指针,通过指针调用构造函数,将插入的参数进行实例化。
示例性的,sql中类的实例化:
select mycls(100,200);
表中类的实例化:
insert into t values(1,mycls(100,200));
plsql中类的实例化:
DECLARE
cls mycls;
BEGIN
cls=new mycls(100,200);
END。
优选的,可以将所述根据类名查找内存结构中构造函数方法中构造函数的指针执行构造函数,生成对象实例,具体优化为:根据所述内存结构中的构造函数方法判断调用构造函数的参数是否正确,如果正确,则根据类名查找内存结构中构造函数方法中构造函数的指针执行构造函数,生成对象实例。由于ndct_cls_t数据结构中记录相应的方法信息中包括参数的名称、长度和数据类型,可以对插入的参数进行验证,防止实例化失败。
此外,也可将类的实例化数据采用表或者其它数据结构方式表示。示例性的,可以采用object_t结构表示。object_t结构可以形如(类ID,对象ID,属性1,属性2……属性n),对象ID为每个类对象实例的唯一ID。相应的,每个属性的信息可以包括:类标记、是否为空、非空数据的长度和数据值。之所以采用object_t结构表示,可以将属性信息分类整理,在保证信息完整的前提下,方便转换为二进制数据。
S130,在内存中分配临时数据存储表。
为了能够完成实际的数据写入,首先在内存中初始化一个临时数据存储表。由于序列化过程中会产生大量的中间数据,通过在内存中分配临时数据存储表,可以以存储在序列化中产生的中间数据。方便对中间数据进行加工,以生成最终的数据。
S140,通过所述临时数据存储表,按照预设的格式和登记信息将所述对象实例的属性转换为相应的二进制数据。
对象实例中包括若干属性,因此,需要将对象实例的属性转换为相应的二进制数据。同时也需要在二进制数据中增加该对象实例的描述,以与其它对象实例进行区分。在本实施例中,由于序列化的对象中包括较多的属性,需要按照设定的格式将所述对象转换为对应的二进制数据。以使得根据预设的格式可从二进制数据中获取相应的对象实例。示例性的,图2是本发明实施例一提供的数据库中对象类型列的序列化方法中类对象序列化的格式示意图,可参照图2所提供的类对象的序列化的格式对应的规则,进行序列化。由图2可以看出,预设格式包括对象实例本身的描述,即包括类标识,用于说明序列化后二进制数据是否为类对象,类ID则表明其在数据字典中的类ID。对象实例的属性则包括:属性个数和每个属性值,属性个数可用于判断序列化后的二进制数据是否完整。本领域技术人员可在本实施例的教导下,对预设的格式进行各种调整,在此不做赘述。
相应的,可以按照如下方式进行转换:向二进制数据流写入是否为类的标识、类标识符、属性个数和属性值。由于二进制数据流是按照预设规则不停写入处于变化之中,通常缓存在所述临时数据存储表中,并。在所述属性包括对象时,需要写入是否为类的标识,以使得能够从生成的二进制数据中设定的位中确定是否为对象属性。
对象的属性可以包括两种类型,一种为普通数据类型,另一种则为类类型。对于普通数据类型,可以按照图3中设定格式进行变换。图3是本发明实施例一提供的数据库中对象类型列的序列化方法中对象属性为普通数据类型的格式示意图,由图3可以看出,普通数据类型的属性值可以包括:是否为空标识、数据长度和数据值。可以按照图3所对应的格式将属性值写入二进制数据流。
对象类型的一个重要特性就是对象中可以嵌套别的对象,因此,对象实例属性中仍然可以为类类型。图4为本发明实施例一提供的数据库中对象类型列的序列化方法中对象属性为类类型的格式示意图,由图4可以看出,对于对象的属性仍然是对象时,增加了类ID的属性。由于类名相对于类的唯一标识符,即类的ID较长,不适于将其作为对象实例的相关信息,并一并转换为二进制数据。因此,需要根据登记信息获取到对象实例所对应的类的ID,并将类的ID作为信息,一并转换为相应的二进制数据。类类型属性除包括上述属性外还包括:属性中对象的类标识符。通过增加类标识符,可以清楚地表明对象之间的嵌套关系。
所述二进制数据可以选用二进制大对象(binary large object,BLOB),采用BLOB可以存储尺寸较大的文件,适于对象实例。
S150,将所述二进制数据存储在对象表中。
将上述在临时数据存储表中生成的完整的二进制数据存储在对象表中,将对象的属性以二进制数据形式进行保存,完成对象列的序列化。
本实施例通过对象列中的类的登记信息,对实例数据进行实例化,以生成对象实例,并在内存中分配的临时数据存储表,按照预设的格式和登记信息将对象实例转换为二进制数据,并将二进制数据存储在对象表中。可以采用二进制数据表达对象实例,无需增加数据类型的种类。可以较小代价实现对象类型支持的扩展,并可实现类的插入、删除和修改操作。减少了对新数据类型的维护成本,大大简化了对象类型在数据库中的存储逻辑。
在本实施例的一个优选实施方式中,在将所述二进制数据流存储在对象表中,还可增加如下步骤:销毁所述临时数据存储表,以释放内存。由于对象实例的属性信息较多,占据内存的空间较大。在完成序列化后,将临时数据存储表销毁,以释放内存,以提高系统的运行效率。
实施例二
图5为本发明实施例二提供的数据库中对象类型列的序列化方法的流程示意图。本实施例以上述实施例为基础进行优化,将所述按照预设的格式和登记信息将所述对象实例转换为相应的二进制数据,具体优化为:在写入属性为对象时,判断临时数据存储表中是否存在所述对象的唯一标识符;如果不存在所述对象的唯一标识符,则在临时数据存储表中记录所述对象的唯一标识符,并生成所述对象在所述临时数据存储表中记录的标识,在二进制数据流中写入未标记标识、所述对象对应的类唯一标识符、属性个数和属性值;如果存在所述对象的唯一标识符,则从所述临时数据存储表取出记录的对象标记标识,在二进制数据流中写入已标记标识和所述记录的对象标记的标识。
参见图5,所述数据库中对象类型列的序列化方法,包括:
S210,根据保存在数据字典中对象列的描述信息获取对象列对应的类的登记信息。
S220,根据所述登记信息对所述实例数据实例化,以生成对象实例。
S230,在内存中分配临时数据存储表。
S240,通过所述临时数据存储表,在写入属性为对象时,判断临时数据存储表中是否存在所述对象的唯一标识符。
一个对象的成员属性可以是另一个对象。也就是说,对象之间可以相互嵌套。并且一个类的多个属性可能包含同一个对象,或者多个类对象中可能都包括同一对象的属性。在这种情况下,如果对重复的同一对象的属性都进行序列化时,必然消耗大量的内存空间和时间。因此,在本实施例中,在写入属性为对象时,判断临时数据存储表中是否存在所述对象的唯一标识符。利用唯一标识符可以判断所述对象是否重复。
S250,如果不存在所述对象的唯一标识符,则在临时数据存储表中记录所述对象的唯一标识符,并生成所述对象标记,在二进制数据流中写入未标记标识、所述对象对应的类唯一标识符、属性个数和属性值。
如果临时数据存储表不存在所述对象的唯一标识符,则说明所述对象对应的类以前没有出现过。需要在临时数据存储表中记录。由于对象的唯一标识符可以表示该对象,通过数据字典和ndct_cls_t能够获取到该对象的信息,因此可将对象的唯一标识符记录在临时数据存储表中。以使得所述对象后续出现时,可以利用该对象的唯一标识符。由于对象中包含指向同一对象的属性对象可能存在多个,因此还要生成所述对象在所述临时数据存储表中记录的标识。
示例性的,所述对象的记录标识可以为pack_ID,其中pack_ID为从1开始递增的整数。每当一个新的对象出现时,即在原来pack_ID的基础上加一。生成新的pack_ID并保存在临时数据存储表中。在二进制数据流中写入未标记标识、所述对象对应的类唯一标识符、属性个数和属性值。通过未标记标识可标记该对象是首次出现。
S260,如果存在所述对象的唯一标识符,则从所述临时数据存储表取出记录的对象标记的标识,在二进制数据流中写入已标记标识和所述记录的对象标记的标识。
如果存在所述对象的唯一标识符,则说明所述对象之前出现过。因此只需取出记录的标识pack_ID,在二进制数据流中写入已标记标识和所述记录的对象标记的标识。这样,在序列化时,就无需对相同的对象重复进行序列化。只需在二进制数据流中写入pack_ID即可。
例如:有下面的三个类:
create class cls01as a int;b int;end;
create class cls02as c int;d int;end;,
create class clsA as c1int,c2cls01;c3cls01;c4cls02;end;
可以看到,类clsA有4个属性,c1为普通数据类型,c2和c3为类cls01类型,c4为cls02类型,下面实例化一个类对象:
o1=cls01(1,2);
o2=cls02(2,3);
o=clsA(1,o1,o1,o2);
o1为类cls01的对象实例,o2为cls02类的对象实例,o为clsA的对象实例,其中属性c2和c3指向同一个对象实例o1。当将对象o插入对象列时,依据上述类对象序列化的规则,将对象o进行序列化。
图6是本发明实施例二提供的数据库中对象类型列的序列化方法中增加记录的标识的属性值的格式示意图,图6示出了按照上述方案序列化的属性的格式。由图6可以看出,增加了是否已标记标识,即是否是已pack的位,如果已pack的位为标识0,则仍旧按照实施例一中的图3的格式进行序列化。如果已pack的位为标识1,则可删除相应的属性值,只需标记packid即可。
S270,将所述二进制数据存储在对象表中。
本实施例通过将所述按照预设的格式和登记信息将所述对象实例转换为相应的二进制数据,具体优化为:在写入属性为对象时,判断临时数据存储表中是否存在所述对象的唯一标识符;如果不存在所述对象的唯一标识符,则在临时数据存储表中记录所述对象的唯一标识符,并生成所述对象在所述临时数据存储表中记录的标识,在二进制数据流中写入未标记标识、所述对象对应的类唯一标识符、属性个数和属性值;如果存在所述对象的唯一标识符,则从所述临时数据存储表取出记录的对象标记的标识,在二进制数据流中写入已标记标识和所述记录的对象标记的标识。通过临时数据存储表和所述对象在所述临时数据存储表中记录的标识,能够识别包含指向同一对象的属性对象是否已经被序列化,并在序列化时,直接读取同一属性对象的序列化结果,无需对同一对象多次序列化。减少了空间的消耗,提升了序列化的速度。
实施例三
本实施例提供了一种数据库中对象类型列的反序列化方法。本实施例的方法可以由数据库中对象类型列的反序列化装置来执行,该装置可通过硬件和/或软件的方式实现,并一般可以集成于关系数据库内。
参见图7,所述数据库中对象类型列的反序列化方法包括:
S310,根据二进制数据判断是否为列对象序列化数据。
反序列化可以看做是序列化的逆过程,其作用是将通用存储格式的数据,例如二进制数据转换为对象。在本实施例中,将按照上述实施例中按照预设格式生成的二进制数据重新转换为对象。
通常,在数据库进行查询操作时,由于需要通过对象的属性作为条件进行查询,而二进制数据无法满足查询条件,因此需要进行反序列化。
由于二进制数据可能是普通的二进制数据也可能是借用二进制数据存储的序列化的类对象数据。因此,需要从二进制数据中判断是否为列对象序列化数据。示例性的,可以通过二进制数据中的是否为类的标识位数据判断是否为列对象序列化数据。例如是否为类的标识位数据为1,则为列对象序列化数据;若为0,则为普通数据。类的标识位可以按照预设的格式确定二进制数据中的具体位置。例如,可以是二进制数据的首位。
S320,如果为列对象序列化数据,在内存中分配临时数据存储表。
根据上述步骤判断,如果为列对象序列化数据,则在内存中分配相应的区域,用于存储临时数据。由于反序列化过程中会产生大量的中间数据,通过在内存中分配临时数据存储表,可以存储在反序列化中产生的中间数据。方便对中间数据进行加工,以生成最终的对象属性。
S330,按照预设的格式确定对象对应的类唯一标识符和属性个数。
与上述步骤操作类似,确定对象对应的类唯一标识符也可通过二进制数据中的类唯一标识符和属性个数相应位的数据。例如类唯一标识符可以是二进制数据中第2-5位,之所以选择4位,则是充分考虑了对象列中类的数量,当然,其具体位数和位置也可根据情况进行调整。相应的,二进制数据中第6-9位可以为属性个数。具体的,在二进制数据中的位置和位数由预设的格式决定。
S340,在临时数据存储表中写入属性的属性值,所述属性的属性值按照预设的格式读取。对象的属性可以包括两种类型,一种为普通数据类型,另一种则为类类型。可以根据是否为类的标识区分普通数据类型或者类类型。对于普通数据类型,可按照设定格式进行读取数据值,并可通过数据长度进行校正。对象类型的一个重要特性就是对象中可以嵌套别的对象,因此,对象实例属性中仍然可以为类类型。对于这种嵌套类型,则需要读出该对象的类唯一标识符、属性个数和属性值。
由于读出属性值是一个过程,在此过程中产生的数据可以缓存在临时数据存储表中。在读出属性值完成后,可以从临时数据存储表中获取属性值,并可利用所述属性值实现查询等操作。
本实施例通过判断根据预设的格式在临时数据存储表中读取相应的对象属性和属性信息,可以直接从序列化数据中直接获取得到对象列的实例数据。可以在用户查询对象列时,将类对象数据返回给用户。实现传统关系型数据库支持对象列的查询操作。
在本实施例的一个优选实施方式中,在将在临时数据存储表中写入属性的属性值,所述属性的属性值按照预设的格式读取之后,还可增加如下步骤:
将所述写入属性的属性值存入内存结构中,并销毁所述临时数据存储表;或在查询操作结束时,销毁所述临时数据存储表。优选的,可以在反序列化开始时,生成内存结构object_t,可以将其设为obj1,为其生成一个新的对象ID;并将按照预设的格式读取的各种信息填入obj1。在进行查询操作时,可以直接从内存结构中获取属性。由于临时数据存储表中存储着中间数据,数据量较大,因此,在将属性存入内存结构后,可以销毁所述临时数据存储表,以释放内存。或者也可在查询时,直接采用临时数据存储表中在读出属性值完成后生成的属性数据。并在在查询操作结束时,销毁所述临时数据存储表。以释放内存,以提高系统的运行效率。
实施例四
图8为本发明实施例四提供的数据库中对象类型列的反序列化方法的流程示意图。本实施例以上述实施例为基础进行优化,将所述按照预设的格式读取属性的属性值,具体优化为:根据属性值中是否为类的标识判断属性是否为类类型,如果为类类型,则读取所述对象是否已标记的标识;如果为未标记标识,则生成所述对象的唯一标识符和对象标记的标识,并从所述二进制数据中读取所述属性中类类型的类唯一标识符、属性个数和属性值,并将所述类唯一标识符、属性个数和属性值存入单元格式中。并将所述单元格式的指针写入对应的属性值中;如果所述对象是否已标记的标识为已标记标识,根据所述对象标记查找对应的对象唯一标识符,并通过所述唯一标识符确定对应的单元格式,将指向所述单元格式的指针写入属性值中。
参见图8,所述数据库中对象类型列的反序列化方法,包括:
S410,根据二进制数据判断是否为列对象序列化数据。
S420,如果为列对象序列化数据,在内存中分配临时数据存储表。
S430,按照预设的格式确定对象对应的类唯一标识符和属性个数。
S440,根据属性值中是否为类的标识判断属性是否为类类型,如果为类类型,则读取所述对象是否已标记的标识。
如上述实施例所述,一个类的多个属性可能包含同一个对象,或者多个类对象中可能都包括同一对象的属性。由于在序列化时,利用临时数据存储表和对象标记,可避免对相同的对象重复进行序列化。由于是利用对象标记确定所述对象是否已经被序列化,因此,在确定属性为类类型时,需要读取所述对象标记的标识。读取对象标记的标识同样需要按照预设的格式从相应位读取。示例性的,对象标记为pack标记,可分为已pack和未pack标记,分别用1和0表示。Pack标记可以在类类型属性的的二进制数据的第三位,可通过读取类类型属性的的二进制数据的第三位读取所述对象标记的标识。
S450,如果所述对象是否已标记的标识为未标记标识,则生成所述对象的唯一标识符和对象标记的标识,并从所述二进制数据中读取所述属性中类唯一标识符、属性个数和属性值,并将所述类唯一标识符、属性个数和属性值存入单元格式中,并将所述单元格式的指针写入对应的属性值中。
如果读取到所述对象是否已标记的标识为未标记标识,则说明属性中的对象是相同对象中第一个被序列化的。因此为其生成一个新的对象标识符和对象标记的标识,并将所述对象的唯一标识符和对象标记标识写入临时数据存储表。供后续其它对象属性在反序列化时进行查找。并按照预设的格式读取属性信息,并将这些属性信息存入预设的单元格式。所述单元格式可根据预设格式生成,可以将从二进制数据中读取的各种信息填入并存储。所述单元格式可以在临时数据存储表中分配得到,也可以在内存中分配得到。
示例性的,可以在反序列化开始时,生成内存结构object_t,该内存结构也可以视为一种单元格式,可以将其设为obj1。若其属性中是否已pack标记为0,则初始化一个object_t内存结构,设为objn,为其生成一个新的对象ID,将此新的对象ID和pack_ID,其中pack_ID为从1开始递增的整数写入临时数据存储表。从二进制字节中读取objn对应的类的类ID、属性个数和每个属性的属性值填入objn,将指向objn的指针写入obj1,通过将指向objn的指针写入obj1,可以在查询对象时,根据指针即可得到对象属性。
S460,如果所述对象是否已标记的标识为已标记标识,根据所述对象标记的标识查找对应的对象唯一标识符,并通过所述唯一标识符确定对应的单元格式,将指向所述单元格式的指针写入属性值中。
如果所述对象是否已标记的标识为已标记标识,则说明属性中的对象已经被反序列化,无需重复进行反序列化,只需读取出对象标记的标识,根据对象标记的标识在临时数据存储表中查找相应的对象唯一标识符,并根据对象唯一标识符找到以前生成的单元格式。
示例性的,若已pack标记为1,从二进制数据中顺序读出pack_ID,根据此pack_ID去内存临时表中寻找对应的对象ID,再根据此对象ID找到之前已生成的ojbn,将指向objn的指针写入obj1。由于属性存储在objn内存结构中,因此,只需将objn的指针写入obj1的属性中。
本实施例通过将所述按照预设的格式读取属性的属性值,具体优化为:在根据属性值中是否为类的标识判断属性是否为类类型,如果为类类型,则读取所述对象是否已标记的标识;如果所述对象是否已标记的标识为未标记标识,则生成所述对象的唯一标识符和对象标记的标识,并从所述二进制数据中读取所述属性中类类型的类唯一标识符、属性个数和属性值,并将所述类唯一标识符、属性个数和属性值存入单元格式中,并将所述单元格式的指针写入对应的属性值中;如果所述对象是否已标记的标识为已标记标识,根据所述对象标记的标识查找对应的对象唯一标识符,并通过所述唯一标识符确定对应的单元格式,将指向所述单元格式的指针写入属性值中。通过临时数据存储表和所述对象标记的标识,能够识别对象与其它对象是否相同,并在反序列化时无需对同一对象多次反序列化。减少了内存空间的消耗,提升了反序列化的速度。
实施例五
图9是本发明实施例五提供的数据库中对象类型列的序列化装置结构示意图,如图9所示,所述装置包括:
获取模块510,用于根据保存在数据字典中对象列的描述信息获取对象列对应的类的登记信息;
生成模块520,用于根据所述登记信息对实例数据实例化,以生成对象实例;
分配模块530,用于在内存中分配临时数据存储表;
转换模块540,用于通过所述临时数据存储表,按照预设的格式和登记信息将所述对象实例的属性转换为相应的二进制数据;
存储模块550,用于将所述二进制数据存储在对象表中。
本发明实施例提供的数据库中对象类型列的序列化装置,通过对象列中的类的登记信息,对实例数据进行实例化,以生成对象实例,并在内存中分配临时数据存储表,按照预设的格式和登记信息将对象实例转换为二进制数据,并将二进制数据存储在对象表中。可以采用二进制数据表达对象实例,无需增加数据类型的种类。可以较小代价实现对象类型支持的扩展,并可实现类的插入、删除和修改操作。减少了对新数据类型的维护成本,大大简化了对象类型在数据库中的存储逻辑。
在上述各实施例的基础上,所述装置还包括:
销毁模块,用于销毁所述临时数据存储表,以释放内存。
在上述各实施例的基础上,所述登记信息包括:
保存在数据字典中的类唯一标识符、类名称和类的创建语句;和
保存在内存结构中的类唯一标识符、类名称、加密属性、继承属性、类的属性和方法信息,所述方法信息包括方法中参数的名称、长度、数据类型和方法的调用指针。
在上述各实施例的基础上,所述生成模块用于:
根据类名查找内存结构中构造函数方法中构造函数的指针,执行构造函数,生成对象实例。
在上述各实施例的基础上,所述转换模块,包括:
写入单元,用于向二进制数据流写入是否为类的标识、类标识符、属性个数和属性值。
在上述各实施例的基础上,所述写入单元用于:
在写入属性为对象时,判断临时数据存储表中是否存在所述对象的唯一标识符;
如果不存在所述对象的唯一标识符,则在临时数据存储表中记录所述对象的唯一标识符,并生成所述对象标记的标识,在二进制数据流中写入未标记标识、所述对象的唯一标识符、属性个数和属性值;
如果存在所述对象的唯一标识符,则从所述临时数据存储表取出记录的对象标记的标识,在二进制数据流中写入已标记标识和所述记录的对象标记的标识。
在上述各实施例的基础上,所述生成模块包括:
生成子单元,用于根据所述内存结构中的构造函数方法判断调用构造函数的参数是否正确,如果正确,则根据类名查找内存结构中构造函数方法中构造函数的指针执行构造函数,生成对象实例。
本发明实施例所提供数据库中对象类型列的序列化装置可用于执行本发明任意实施例提供的数据库中对象类型列的序列化方法,具备相应的功能模块,实现相同的有益效果。
实施例六
图10是本发明实施例六提供的数据库中对象类型列的反序列化装置的结构示意图,如图10所示,所述装置包括:
判断模块610,用于根据二进制数据判断是否为列对象序列化数据;
分配模块620,用于如果为列对象序列化数据,在内存中分配临时数据存储表;
确定模块630,用于按照预设的格式确定对象对应的类唯一标识符和类的属性个数;
读取模块640,用于在临时数据存储表中写入属性的属性值,所述属性的属性值按照预设的格式读取。
本实施例提供的数据库中对象类型列的反序列化装置,通过判断根据预设的格式在临时数据存储表中读取相应的对象属性和属性信息,可以直接从序列化数据中直接获取得到对象列的实例数据。可以在用户查询对象列时,并可将类对象数据返回给用户。实现传统关系型数据库支持对象列的查询操作。
在上述各实施例的基础上,所述装置还包括:
销毁模块,用于将所述写的属性的属性值存入内存结构中,并销毁所述临时数据存储表;或在查询操作结束时,销毁所述临时数据存储表。
在上述各实施例的基础上,所述读取模块用于:
根据属性值中是否为类的标识判断属性是否为类类型,如果为类类型,则读取所述对象是否已标记的标识;
如果所述对象是否已标记的标识为未标记标识,则生成所述对象的唯一标识符和对象标记的标识,并从所述二进制数据中读取所述属性中类类型的类唯一标识符、属性个数和属性值,并将所述类唯一标识符、属性个数和属性值存入单元格式中,并将所述单元格式的指针写入对应的属性值中;
如果所述对象是否已标记的标识为已标记标识,根据所述对象标记的标识查找对应的对象唯一标识符,并通过所述唯一标识符确定对应的单元格式,将指向所述单元格式的指针写入属性值中。
本发明实施例所提供数据库中对象类型列的反序列化装置可用于执行本发明任意实施例提供的数据库中对象类型列的反序列化方法,具备相应的功能模块,实现相同的有益效果。
显然,本领域技术人员应该明白,上述本发明的各模块或各步骤可以通过如上所述的设备实施。可选地,本发明实施例可以用计算机装置可执行的程序来实现,从而可以将它们存储在存储装置中由处理器来执行,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等;或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件的结合。注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。
Claims (6)
1.一种数据库中对象类型列的序列化方法,其特征在于,包括:
根据保存在数据字典中对象列的描述信息获取对象列对应的类的登记信息;
根据所述登记信息对实例数据实例化,以生成对象实例;
在内存中分配临时数据存储表;
在写入属性为对象时,判断临时数据存储表中是否存在所述对象的唯一标识符;
如果不存在所述对象的唯一标识符,则在临时数据存储表中记录所述对象的唯一标识符,并生成所述对象标记的标识,在二进制数据流中写入未标记标识、所述对象的唯一标识符、属性个数和属性值;
如果存在所述对象的唯一标识符,则从所述临时数据存储表取出记录的对象标记的标识,在二进制数据流中写入已标记标识和所述记录的对象标记的标识;
将所述二进制数据存储在对象表中。
2.根据权利要求1所述的方法,其特征在于,所述登记信息包括:
保存在数据字典中的类唯一标识符、类名称和类的创建语句;和保存在内存结构中的类唯一标识符、类名称、加密属性、继承属性、类的属性和方法信息,所述方法信息包括方法中参数的名称、长度、数据类型和方法的调用指针。
3.一种数据库中对象类型列的反序列化方法,其特征在于,包括:
根据二进制数据判断是否为列对象序列化数据;
如果为列对象序列化数据,在内存中分配临时数据存储表;
按照预设的格式确定对象对应的类唯一标识符和类的属性个数;
在临时数据存储表中写入属性的属性值,
根据属性值中是否为类的标识判断属性是否为类类型,如果为类类型,则读取所述对象是否已标记的标识;
如果所述对象是否已标记的标识为未标记标识,则生成所述对象的唯一标识符和对象标记的标识,并从所述二进制数据中读取所述属性中类类型的类唯一标识符、属性个数和属性值,并将所述类唯一标识符、属性个数和属性值存入单元格式中,并将所述单元格式的指针写入对应的属性值中;
如果所述对象是否已标记的标识为已标记标识,根据所述对象标记的标识查找对应的对象唯一标识符,并通过所述唯一标识符确定对应的单元格式,将指向所述单元格式的指针写入属性值中。
4.一种数据库中对象类型列的序列化装置,其特征在于,包括:
获取模块,用于根据保存在数据字典中对象列的描述信息获取对象列对应的类的登记信息;
生成模块,用于根据所述登记信息对实例数据实例化,以生成对象实例;
分配模块,用于在内存中分配临时数据存储表;
转换模块,用于在写入属性为对象时,判断临时数据存储表中是否存在所述对象的唯一标识符;
如果不存在所述对象的唯一标识符,则在临时数据存储表中记录所述对象的唯一标识符,并生成所述对象标记的标识,在二进制数据流中写入未标记标识、所述对象的唯一标识符、属性个数和属性值;
如果存在所述对象的唯一标识符,则从所述临时数据存储表取出记录的对象标记的标识,在二进制数据流中写入已标记标识和所述记录的对象标记的标识;
存储模块,用于将所述二进制数据存储在对象表中。
5.根据权利要求4所述的装置,其特征在于,所述登记信息包括:
保存在数据字典中的类唯一标识符、类名称和类的创建语句;和保存在内存结构中的类唯一标识符、类名称、加密属性、继承属性、类的属性和方法信息,所述方法信息包括方法中参数的名称、长度、数据类型和方法的调用指针。
6.一种数据库中对象类型列的反序列化装置,其特征在于,包括:
判断模块,用于根据二进制数据判断是否为列对象序列化数据;
分配模块,用于如果为列对象序列化数据,在内存中分配临时数据存储表;
确定模块,用于按照预设的格式确定对象对应的类唯一标识符和类的属性个数;
读取模块,用于根据属性值中是否为类的标识判断属性是否为类类型,如果为类类型,则读取所述对象是否已标记的标识;
如果所述对象是否已标记的标识为未标记标识,则生成所述对象的唯一标识符和对象标记的标识,并从所述二进制数据中读取所述属性中类类型的类唯一标识符、属性个数和属性值,并将所述类唯一标识符、属性个数和属性值存入单元格式中,并将所述单元格式的指针写入对应的属性值中;
如果所述对象是否已标记的标识为已标记标识,根据所述对象标记的标识查找对应的对象唯一标识符,并通过所述唯一标识符确定对应的单元格式,将指向所述单元格式的指针写入属性值中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710576532.3A CN107341262B (zh) | 2017-07-14 | 2017-07-14 | 数据库中对象类型列的序列化、反序列化方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710576532.3A CN107341262B (zh) | 2017-07-14 | 2017-07-14 | 数据库中对象类型列的序列化、反序列化方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107341262A CN107341262A (zh) | 2017-11-10 |
CN107341262B true CN107341262B (zh) | 2020-01-21 |
Family
ID=60219770
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710576532.3A Active CN107341262B (zh) | 2017-07-14 | 2017-07-14 | 数据库中对象类型列的序列化、反序列化方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107341262B (zh) |
Families Citing this family (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108536798B (zh) * | 2018-04-02 | 2020-12-01 | 携程旅游网络技术(上海)有限公司 | 订单级别的数据库数据的恢复方法及系统 |
CN110914799B (zh) * | 2018-06-30 | 2023-02-28 | 华为云计算技术有限公司 | 一种反序列化方法、装置以及计算设备 |
CN109117209B (zh) * | 2018-07-23 | 2021-10-01 | 广州多益网络股份有限公司 | 序列化和反序列化方法及装置 |
CN109165209B (zh) * | 2018-08-14 | 2021-06-08 | 上海达梦数据库有限公司 | 数据库中对象类型的数据校验方法、装置、设备及介质 |
CN110855727A (zh) * | 2018-08-21 | 2020-02-28 | 苏州迈科网络安全技术股份有限公司 | 基于字节序列化和反序列化的数据对象的传输系统和方法 |
CN109284340B (zh) * | 2018-09-14 | 2020-11-20 | 清华大学 | 资源受限智能对象中关系型数据的存储及检索方法 |
CN109582231B (zh) * | 2018-11-21 | 2022-03-15 | 金色熊猫有限公司 | 数据存储方法、装置、电子设备及存储介质 |
CN110007906B (zh) * | 2018-12-27 | 2023-03-10 | 创新先进技术有限公司 | 脚本文件的处理方法、装置和服务器 |
CN110619218B (zh) * | 2018-12-29 | 2022-07-12 | 北京时光荏苒科技有限公司 | 用于生成信息的方法和装置 |
CN110298032B (zh) * | 2019-05-29 | 2022-06-14 | 西南电子技术研究所(中国电子科技集团公司第十研究所) | 文本分类语料标注训练系统 |
CN111931200B (zh) * | 2020-07-13 | 2024-02-23 | 车智互联(北京)科技有限公司 | 一种数据序列化方法、移动终端和可读存储介质 |
CN112445471A (zh) * | 2020-11-17 | 2021-03-05 | 北京仿真中心 | 基于数字试验或训练的通用数据解析软件架构设计方法 |
CN112612427B (zh) * | 2020-12-30 | 2022-11-25 | 北京优挂信息科技有限公司 | 一种车辆停靠点数据处理方法、装置、存储介质及终端 |
CN112597170B (zh) * | 2020-12-31 | 2024-02-06 | 平安银行股份有限公司 | Redis数据库的优化方法与系统 |
CN115577017B (zh) * | 2022-11-21 | 2023-02-28 | 四川蜀天信息技术有限公司 | 一种基于序列化和反序列化检索数据的方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106570018A (zh) * | 2015-10-10 | 2017-04-19 | 阿里巴巴集团控股有限公司 | 序列化与反序列化的方法、装置、系统以及电子设备 |
CN106843819A (zh) * | 2015-12-03 | 2017-06-13 | 北京国双科技有限公司 | 对象序列化的方法及装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20160261645A1 (en) * | 2015-03-06 | 2016-09-08 | LeGuard, Inc. | Mobile application local time zone shifting |
-
2017
- 2017-07-14 CN CN201710576532.3A patent/CN107341262B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106570018A (zh) * | 2015-10-10 | 2017-04-19 | 阿里巴巴集团控股有限公司 | 序列化与反序列化的方法、装置、系统以及电子设备 |
CN106843819A (zh) * | 2015-12-03 | 2017-06-13 | 北京国双科技有限公司 | 对象序列化的方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN107341262A (zh) | 2017-11-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107341262B (zh) | 数据库中对象类型列的序列化、反序列化方法及装置 | |
CN108763171B (zh) | 一种基于格式模板的文档自动化生成方法 | |
CN101145152B (zh) | 在特定上下文内自动精细化本体的系统和方法 | |
CN105608088B (zh) | 一种基于配置文件的数据库自动创建与数据动态记录方法 | |
US7430563B2 (en) | System for storing and retrieving data | |
US7730099B2 (en) | Storage and retrieval of richly typed hierarchical network models | |
US8635253B2 (en) | Decorated model architecture for efficient model-driven application development | |
US11334549B2 (en) | Semantic, single-column identifiers for data entries | |
US20110225599A1 (en) | Observing properties associated with an object in an object-oriented programming platform | |
US9864794B2 (en) | Method and system for managing faceted data | |
JP2005070911A (ja) | 構造化文書のデータを検索する装置および方法 | |
JP4746698B2 (ja) | 分類オブジェクトのモデル化 | |
CN110956271B (zh) | 一种海量数据的多级分类方法及装置 | |
CN103425789B (zh) | 一种时空数据的查询方法及装置 | |
MXPA03004411A (es) | Sistema y metodo para definir y utilizar subclases declarativamente por marcas. | |
CN111797278A (zh) | 一种映射关联对象与关系的方法 | |
US7702691B2 (en) | Systems and methods for EJB finders using SQL | |
CN103530353B (zh) | 一种导航用户数据格式的自识别方法 | |
CN110083339A (zh) | 一种新型计算机编程语言 | |
US8719693B2 (en) | Method for storing localized XML document values | |
CN110162531B (zh) | 一种分布式并发数据处理任务决策方法 | |
CN110750514A (zh) | 一种为主数据打标签的方法及终端 | |
CN116842125B (zh) | 一种富媒体信息的存储方法及自然语言智能检索方法 | |
JP2005202612A (ja) | データベース生成プログラム作成装置 | |
CN112800284A (zh) | 一种基于环境模型数据库的快速查询方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |