自描述数据对象的处理方法

文档序号:6605517阅读:440来源:国知局
专利名称:自描述数据对象的处理方法
技术领域
本发明涉及一种自描述数据对象的处理方法,特别是指一种用户不需要了解该数据类型的内部结构,而仅通过该数据类型提供的提供方法,就可以方便地访问相应的内部结构成员的数据处理方法,数据计算机信息处理技术领域。
背景技术
我们使用计算机的最主要目的就在于计算机能够迅速处理日常工作、科研、学习中所接触到的大量数据、信息。软件编程人员的主要工作就是根据相应的处理方法和步骤,利用程序设计语言,例如C/C++语言,编制相应的软件来组织和处理上述的数据和信息,使计算机在有限的条件下更加有效地为人类服务。
众所周知,任何一种编程语言都确定了若干种数据类型用来包容信息数据,而且大多数的数据类型,特别是一些简单的数据类型,在其他的编程语言中都有着简单的对应,例如字符类型数据(char)、整型数据(int)、长整型数据(long)等。同时,为了便于软件开发者更加有效地组织数据,大多数编程语言(例如,C/C++语言)还支持在已有数据类型的基础上,通过一些关键字派生出用户自定义的数据类型,例如类数据类型(Class)、结构数据类型(Struct)和联合数据类型(Union)等。
在美国微软公司开发的桌面操作系统(例如WINDOWS 98)中,它的字符串数据类型主要采用的是字符指针(char*)或字指针(wchar_t*)的指针类型;虽然字符指针(char*)或字指针(wchar_t*)在某种程度上属于自描述数据类型,但对于构件技术而言,这些信息还存在缺陷;例如它缺乏字符串的长度描述信息。
在中间件的应用开发中,构件接口参数的列集(Marshalling)和散集(UnMarshalling)起着关键性的作用,除了整型和布尔型这类的简单类型能被顺利处理外,其他部分的复杂类型则将消耗系统的很大一部分资源用于处理传递参数的列集和散集。虽然操作系统在传递参数的Marshalling和UnMarshalling时可以通过标准的库(lib)函数的调用来获得这些额外信息,但对服务端而言这还是在一定程度上增加了系统的负载,因为,这些字符串的长度毕竟是在创建伊始就已经确定,而且字符串类型是使用最频繁的数据类型之一,对为基于构件的操作系统来说,这种损耗就是一种浪费。
在传统的应用编程习惯中(例如C/C++语言),编程者如果需要确定了一个存储1000个字节的缓存空间通常就简单的定义为#define BUFLENGTH 1000BYTE buf[BUFLENGTH];开发者在使用该缓存空间时通常关心的是数据缓存空间(buf)中实际参与计算的内容,却很少注意缓存空间(buf)的自我描述性。
在网络计算中,一个没有特征的数据可能会增加服务的不必要负担。就上述例子而言,该缓存空间(buf)所携带的信息太少,为防止内存溢出,在将这段数据传递给某个远程服务接口时,还必须附带上该缓存空间(buf)的容量;例如(C/C++语言)HRESULT__stdcall X_method(BYTE*pBuf,INT capacity);如果该段缓存空间(buf)中有部分内容正被其他服务使用,而在当前服务中又不希望被覆盖,那么接口方法的实现将声明如下HRESULT__stdcall X_method(BYTE*pBuf,
INT capacity,INT used);其中参数used用于表示使用过的字节。
这种接口方法的定义并不成功!因为,让服务端花费多余的处理来识别后两个参数是资源的一种浪费。而出现这种接口方法定义的主要原因在于传统的操作系统对于这种常见的参数传递习惯没有定义一种合适的数据类型来处理它。而在面向网络的应用程序中,数据应该是自描述的。
自描述数据类型是指这样的一些数据类型该数据类型自身所带有的数据信息已经足够描述其自身的特征,例如占用内存的情况、其基本属性及其它的相关信息等,它在不需要其他附加条件的情况下也能够实现自我描述的数据类型。
在传统的编程语言的数据类型中,数据类型double、float等兼容IEEE实数标准的数据类型就是自描述的数据类型。假设服务端获得一个double的参数传递,该服务端就能够确定①现在得到的是一个占8个字节的连续内存区域;②共有64位;③其中第一位是符号位,11位是指数位,52位是尾数位;④数值的范围为±1.7e308。
这些信息是很明确的,也足够描述该数据类型的特征。再比如说如果传递的是字符串指针(char*)指针类型的参数,则可以知道这是一个32位的指针,它指向一个以字节为单位的连续的字符缓存空间,该连续空间以′\0′标示结束。因此,可以得到该连续字符空间的起始地址及结束地址,也就可以得到该字符串的长度,所以,字符串指针(char*)的数据类型为自描述的数据类型。而字节指针(byte*)或(void*/PVOID)的数据类型则不属于自描述的数据类型,因为他们自身所携带的信息不足以描述其自身。
非指针型基础数据类型基本上属于自描述类型,除了字符指针外,其他基础数据类型指针型基本上不是自描述数据类型。
另外,C/C++语言中,除了这些基础数据类型外,同时还支持用户自定义数据类型,例如typedef class CStudent CStudent,*pStudent;class CStudent{BYTE *pData;PublicINT age;Char *pClassName;};就这个例子而言,CStudent及pStudent都不属于自描述数据类型,其成员pData不具有描述自身的特性。如果略加修改为typedef class Cstudent Cstudent,*pStudent;class Cstudent {INT dataLen;BYTE *pData;PublicINT age;Char *pClassName;};其中新增的成员变量dataLen将用于记录数据指针pData的大小。那么从某种程度上的应用来说它基本符合了自描述数据类型的要求。但是,它依然不能作为操作系统的自描述基本数据类型;因为,这个数据类型毕竟是用户自定义的,操作系统无从得知用户的具体约定。因此,就应用而言,自描述数据类型是相对于需求的。在实际应用开发中,需要根据需求通过最简练的设计包容最有效的信息,当然也无需刻意追求自描述的效果,因为实现自描述需要额外的系统存储资源。
20世纪80年代末期,个人电脑的功能有了很大的进步。因此,市场提出了文件相互嵌套的需求,例如在美国微软公司开发的文字处理软件MS Word的文件中,经常需要插入该公司开发的另一电子表格处理软件MSExcel的报表。为此,美国微软公司开发了对象链接和嵌入(Object LinkingEmbedding,简称OLE)技术。由于OLE缺乏程序模型的理论基础,微软公司于20世纪90年代初期进一步发表了组件对象模型(Component Objectmodel,简称COM)技术。COM技术实际上是一组指导人们如何编程的规范。符合COM技术规范的程序模块可以动态链接安装,正如具有公制镙口的部件之间可以相互对接安装一样。
在COM技术中,应用程序之间、应用程序和系统之间的相互作用是通过一组称作接口(interface)的功能实现的。COM构件可用许多编程语言来实现;并且客户程序端程序可用完全不同的编程语言来编写。因此COM技术为此定义了接口描述语言(interface description language,简称idl)。作为一个语言,它定义了大多数编程语言支持的基本数据类型,并且支持了一些特定的数据类型用于OLE自动化(OLE,Automation),譬如数据类型BSTR和数据类型SAFEARRAY等。
基础自描述数据类型在传统开发中并不能很好的体现它的优势,因为在传统的单道程序或″客户/服务器″(C/S)二层体系结构设计中,对数据是否自描述没有太多要求;它可以通过用户的自我约定及额外的参数传递来解决这个问题,而且对于二层体系结构来说它在资源上的消耗是微乎其微的。
但是,在网络技术迅猛发展的今天,″客户/中间件/服务器″三层乃至多层体系结构、中间件技术、网格(Grid)网络计算等新概念新技术层出不穷,传统的操作系统已不能很好的适应WEB服务的要求。

发明内容
本发明的主要目的在于提供一种自描述数据对象的处理方法,用户不需要了解该数据类型的内部结构,而仅通过该数据类型提供的提供方法,方便地访问相应的内部结构成员。
本发明的另一目的在于提供一种自描述数据对象的处理方法,提供字节缓冲数据类型和字符串缓冲数据类型等自描述数据类型,采用数据缓存的自描述数据类型作为输出接口参数,提高数据处理的效率。
本发明的另一目的在于提供一种自描述数据对象的处理方法,在与COM技术兼容的前提下,提供数据类型的内存结构,实现对COM技术的扩展。
本发明的目的是这样实现的一种自描述数据对象的处理方法,它至少包括在使用数据对象时,首先对数据对象实例分配相应的内存空间,对该数据对象实例进行赋值,当取消对该数据对象实例使用的时候,释放该数据对象所占用的存储空间。
该方法还进一步包括对所使用的数据对象实例类型的有效性进行判断,并将判断的结果返回。
该方法还进一步包括对所使用的数据对象实例的类型进行强制转换的操作。
当数据对象实例为字符串对象时,所述的为数据对象实例分配相应内存空间的具体操作至少包括在存储器中为指定的字符串创建其字符串对象实例,分配指定有效长度的内存空间给该字符串对象实例;
所述的为数据对象实例分配相应内存空间的具体操作至少包括重新创建字符串对象实例,并释放原字符串对象实例的内存空间;重新依据有效长度构造字符串对象实例,并释放原字符串对象实例内存空间。
当数据对象实例为字符串或字符缓存对象时,该方法还进一步包括读取字符串长度或字符数。
该方法当数据对象实例为字符串对象时,该方法还进一步包括对两个符串对象进行比较。
当数据对象实例为字节或字符缓存对象时,所述的为数据对象实例分配相应内存空间的具体操作为为字节或字符缓存对象实例分配指定数量的未被初始化或已初始化的内存空间。
当数据对象实例为字节缓存对象时,该方法还进一步包括读取已使用的字节数、设置已被使用的字节数,以及在字节缓存实例对象的缓存空间中插入指定的新内容,且超出缓存空间的容量时,超出的内容将被截断或丢失。
当数据对象实例为字节或字符缓存对象时,该方法还进一步包括读取缓冲区容量,给已存在的字节缓存对象赋新值,以及在被使用的缓存空间之后加入新内容,且超出缓存空间时,超出的内容将被截断。
当数据对象实例为数组对象时,所述的方法至少包括声明一个数组的描述,拷贝该数组的指针;声明一个数组对象,同时为缓冲区分配内存;复制数组对象的数组缓冲区。
当数据对象实例为数组对象时,该方法还进一步包括获取数组的长度、对数组元素进行存取,以及动态创建数组对象,同时为缓冲区分配内存,并返回该数组的描述。
当数据对象实例为数组对象,并且删除该数组对象时,该方法还进一步包括删除该数组的缓冲区,并释放其所占用的内存空间。
所述的字符串对象至少设有第一区域、第二区域和第三区域;其中,第一区域存放该第二区域的长度;第二区域存放统一的字符编码标准字符串;第三区域存放结束符。该字符串对象变量可被分配在栈上或堆上。
所述的字节缓冲对象至少设有至少设有第一部分、第二部分和第三部分;其中,第一部分用于第二部分的长度值,第二部分用于存放字节数据,第三部分存储结束符。该字节缓冲对象变量可被分配在栈上或堆上。
字符缓存对象至少设有第一部分、第二部分和第三部分;其中,第一部分用于第二部分的长度值,第二部分用于存放字节数据,第三部分存储结束符。
所述的字节数据至少包括第一区域、第二区域和第三区域;其中,第一区域用于存储第二区域的长度值,第二区域用于存放统一的字符编码标准字符串,第三部分存储结束符。该字符缓存对象变量可被分配在栈上或堆上。
所述的数组对象至少包括三个部分;其中,第一部分用于存储公共标识(GUID),第二部分用于存储安全序列(SAFEARRAY),第三部分用于存储数组数据。该数组对象可分配在栈上或分配在堆上。
本发明提供的方法,使得用户不需要了解该数据类型的内部结构,而仅通过该数据类型提供的提供方法,就可以方便地访问相应的内部结构成员。本发明所提供的字节缓冲数据类型和字符串缓冲数据类型等自描述数据类型,采用数据缓存的自描述数据类型作为输出接口参数,提高了数据处理的效率。本发明在与COM技术兼容的前提下,提供了数据类型的内存结构,实现了对COM技术的扩展。本发明适用于″客户/中间件/服务器″三层乃至多层的体系结构、中间件技术和Grid网络计算,以及基于构件技术的新一代操作系统。并且具有如下的优点1、可以通过有限的参数传递,得到理想的数据信息;2、能有效地降低服务构件的负载,并能快速响应客户构件的应用请求;3、能有效地减少数据的二义性,避免发生人为的不必要的计算错误;4、满足构件的兼容性要求。


图1为本发明字符串数据类型的存储结构示意图;图2为本发明字节缓存数据类型的存储结构示意图;图3为本发明图2部分存储结构示意图;图4为本发明字符缓存数据类型的存储结构示意图;图5为本发明数组数据类型的存储结构示意图。
具体实施例方式
以下结合附图和具体的实施例对本发明作进一步的详细说明实施例1参见图1,字符串数据类型是为了支持构件化编程而设计的数据结构,一般用来存储用户的常量字符串。它有一个定长的存储区,可以存储用户的字符串。它还保存该字符串的长度,从这个意义上说,字符串数据类型属于自描述数据结构;图1为字符串数据类型的存储结构示意图。
字符串数据类型在C++语言中被定义为一个类,从图中可以看出字符串数据由三部分组成第一部分_ezStrBuf_t存放字符串数据中第二部分EzStr的长度,第一部分占四个字节,第二部分存放统一的字符编码标准(Unicode)字符串,第三部分存放两个字节的’/0’字符用于表示结束。这个结构和美国微软组件对象模型(The Component Object Model,简称COM)的BSTR数据类型的内存结构是相同的。
字符串数据变量可以被定义在栈上和堆上。本实施例中定义了宏EZCSTR,通过该宏可以方便地把字符串数据变量定义在栈上。以C++语言为例,该宏定义如下#define EZCSTR(str)_ezcstr_fixup(sizeof(L##str)-2,(L″\0\0″L##str))INLINE wchar_t*_ezcstr_fixup(int siz,_ezStrBuf_t sbuf){*(int*)sbuf=siz; //override\0\0 with realsizereturn(sbuf+2);}实施例2字节缓存数据类型是为了支持构件化编程而设计的数据结构,它提供存储字节的缓冲区。参见图2,其为字节缓存数据类型的存储结构示意图字节缓存数据类型在C++语言中被定义为一个类,它有一个成员变量byte** m_ppbuf,即图示上的m_ppbuf。字节缓存数据类型在C语言中被定义为byte*类型的指针,该指针指向图2中指针_ezByteBuf_t指向的地方。
由于字节缓存数据类型在C语言中指向的是指针_ezByteBuf_t指向的地方,参见图2,它和COM的BSTR存储存结构是兼容的。截取图2中间的一部分如图3所示;从图2可以看出前四个字节为第一部分_ezByteBuf_t,最后两个字节为第三部分,中间的为第二部分capacity。第一部分存放的值是第二部分的长度,第三部分存储的是结束符’\0’。
其它部分则是对BSTR的扩展。字节缓存数据可以在栈上分配,也可以在堆上分配。
如果用C++编程,可以通过“字节缓存数据<size>buf”在栈上定义一个大小为size的字节缓存数据变量buf,也可以通过宏DECL_EZBYTEBUF(_buf,_siz)在栈上定义一个大小为_siz的EzByteBuf类型的变量_buf。
如果用C语言编程,只能通过宏DECL_EZBYTEBUF(_buf,_siz)来定义一个大小为_siz的EzByteBuf类型的变量_buf。
实施例3字符缓存数据类型是上述两个实施例中数据类型的的结合体。与字节缓存数据相比,最主要的区别是字符缓存数据中存放的是一个字符串数据对象,而字节缓存数据类型可以存放任何数据。它的存储结构参见图4。
进一步参照图1-图3,并参见图4,字符缓存数据类型就是字节缓存数据中存放一个字符串数据结构,在此不再赘述。
与上述的两种数据类型一样,字符缓存数据既可以定义在栈上,也可以定义在堆上。
实施例4参见图5,数组数据类型用来定义一个多维、定长、自描述数据类型的数组,它的内存结构参见图5。数组数据类型是对微软COM的安全数组(SAFEARRAY)的扩展。在C++中,它被定义为一个类。该类有一个成员变量m_psa,该变量被定义为安全数组(SAFEARRAY)的指针类型。本实施例中在安全数组描述符(safearray descriptor)前面增加16个字节,用于存放公共标识(guid)。
数组数据类型变量既可以分配在栈上,也可以分配在堆上。
最后应说明的是以上实施例仅用以说明本发明而并非限制本发明所描述的技术方案;因此,尽管本说明书参照上述的各个实施例对本发明已进行了详细的说明,但是,本领域的普通技术人员应当理解,仍然可以对本发明进行修改或者等同替换;而一切不脱离本发明的精神和范围的技术方案及其改进,其均应涵盖在本发明的权利要求范围当中。
权利要求
1.一种自描述数据对象的处理方法,其特征在于它至少包括在使用数据对象时,首先对数据对象实例分配相应的内存空间,对该数据对象实例进行赋值,当取消对该数据对象实例使用的时候,释放该数据对象所占用的存储空间。
2.根据权利要求1所述的自描述数据对象的处理方法,其特征在于该方法还进一步包括对所使用的数据对象实例类型的有效性进行判断,并将判断的结果返回。
3.根据权利要求1所述的自描述数据对象的处理方法,其特征在于该方法还进一步包括对所使用的数据对象实例的类型进行强制转换的操作。
4.根据权利要求1或2或3所述的自描述数据对象的处理方法,其特征在于当数据对象实例为字符串对象时,
所述的为数据对象实例分配相应内存空间的具体操作至少包括在存储器中为指定的字符串创建其字符串对象实例,分配指定有效长度的内存空间给该字符串对象实例;所述的为数据对象实例分配相应内存空间的具体操作至少包括重新创建字符串对象实例,并释放原字符串对象实例的内存空间;重新依据有效长度构造字符串对象实例,并释放原字符串对象实例内存空间。
5.根据权利要求1或2或3所述的自描述数据对象的处理方法,其特征在于当数据对象实例为字符串或字符缓存对象时,该方法还进一步包括读取字符串长度或字符数。
6.根据权利要求1或2或3所述的自描述数据对象的处理方法,其特征在于该方法当数据对象实例为字符串对象时,该方法还进一步包括对两个符串对象进行比较。
7.根据权利要求1或2或3所述的自描述数据对象的处理方法,其特征在于当数据对象实例为字节或字符缓存对象时,所述的为数据对象实例分配相应内存空间的具体操作为为字节或字符缓存对象实例分配指定数量的未被初始化或已初始化的内存空间。
8.根据权利要求1或2或3所述的自描述数据对象的处理方法,其特征在于当数据对象实例为字节缓存对象时,该方法还进一步包括读取已使用的字节数、设置已被使用的字节数,以及在字节缓存实例对象的缓存空间中插入指定的新内容,且超出缓存空间的容量时,超出的内容将被截断或丢失。
9.根据权利要求1或2或3所述的自描述数据对象的处理方法,其特征在于当数据对象实例为字节或字符缓存对象时,该方法还进一步包括读取缓冲区容量,给已存在的字节缓存对象赋新值,以及在被使用的缓存空间之后加入新内容,且超出缓存空间时,超出的内容将被截断。
10.根据权利要求1或2或3所述的自描述数据对象的处理方法,其特征在于当数据对象实例为数组对象时,所述的方法至少包括声明一个数组的描述,拷贝该数组的指针;声明一个数组对象,同时为缓冲区分配内存;复制数组对象的数组缓冲区。
11.根据权利要求1或2或3所述的自描述数据对象的处理方法,其特征在于当数据对象实例为数组对象时,该方法还进一步包括获取数组的长度、对数组元素进行存取,以及动态创建数组对象,同时为缓冲区分配内存,并返回该数组的描述。
12.根据权利要求1或2或3所述的自描述数据对象的处理方法,其特征在于当数据对象实例为数组对象,并且删除该数组对象时,该方法还进一步包括删除该数组的缓冲区,并释放其所占用的内存空间。
13.根据权利要求4所述的自描述数据对象的处理方法,其特征在于所述的字符串对象至少设有第一区域、第二区域和第三区域;其中,第一区域存放该第二区域的长度;第二区域存放统一的字符编码标准字符串;第三区域存放结束符。
14.根据权利要求13所述的自描述数据对象的处理方法,其特征在于所述的字符串对象变量可被分配在栈上或堆上。
15.根据权利要求7所述的自描述数据对象的处理方法,其特征在于所述的字节缓冲对象至少设有至少设有第一部分、第二部分和第三部分;其中,第一部分用于第二部分的长度值,第二部分用于存放字节数据,第三部分存储结束符。
16.根据权利要求15所述的自描述数据对象的处理方法,其特征在于所述的字节缓冲对象变量可被分配在栈上或堆上。
17.根据权利要求5所述的自描述数据对象的处理方法,其特征在于所述的字符缓存对象至少设有第一部分、第二部分和第三部分;其中,第一部分用于第二部分的长度值,第二部分用于存放字节数据,第三部分存储结束符’。
18.根据权利要求17所述的自描述数据对象的处理方法,其特征在于所述的字节数据至少包括第一区域、第二区域和第三区域;其中,第一区域用于存储第二区域的长度值,第二区域用于存放统一的字符编码标准字符串,第三部分存储结束符。
19.根据权利要求17所述的自描述数据对象的处理方法,其特征在于所述的字符缓存对象变量可被分配在栈上或堆上。
20.根据权利要求10所述的自描述数据对象的处理方法,其特征在于所述的数组对象至少包括三个部分;其中,第一部分用于存储公共标识(GUID),第二部分用于存储安全数组(SAFEARRAY),第三部分用于存储数组数据。
21.根据权利要求20所述的自描述数据对象的处理方法,其特征在于所述的数组对象可分配在栈上或分配在堆上。
全文摘要
一种自描述数据对象的处理方法,在使用数据对象时,对数据对象实例分配内存空间,对该数据对象实例进行赋值,当取消对该数据对象实例使用时,释放该数据对象占用的存储空间。本发明使用户不需要了解该数据类型的内部结构,仅通过该数据类型提供的方法,可方便地访问相应的内部结构成员。本发明在兼容COM技术的前提下,提供了数据类型的内存结构。本发明适用于″客户/中间件/服务器″三层乃至多层体系结构、中间件技术和Grid网络计算。并且具有如下的优点可通过有限的参数传递,得到理想的数据信息;能有效地降低服务构件的负载,并能快速响应应用请求;减少了数据的二义性,避免了计算错误;满足了构件的兼容性要求。
文档编号G06F9/45GK1512332SQ0215949
公开日2004年7月14日 申请日期2002年12月31日 优先权日2002年12月31日
发明者陈榕, 梁宇洲, 叶忠强, 王维汉, 榕 陈 申请人:北京科泰世纪科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1