一种基于类模板管理器的通讯报文处理设备和方法
技术领域
本发明涉及信息处理***、方法及其加工产品,具体涉及一种计算机通讯模块报文消息的自动处理设备和方法,更具体地说,涉及一种基于类模板管理器的通讯报文处理设备和方法。
背景技术
为实现***中两个或多个***模块之间进行通讯,通常需要定义统一的报文格式,报文格式可分为两部分:报文头和报文体。报文头说明报文的类型、报文长度等信息;报文体则涉及报文的具体内容,报文体的格式由报文的类型决定。因此,对于计算机***中***模块之间通讯的报文,通常存在着这样特点:共同的报文头格式和不同的报文体格式。
在传统的程序设计中,对于不同的报文通常定义相同的报文头数据结构和不同的报文体数据结构,当实际使用到某个具体报文时,通常是用前面定义报文头数据结构来声明一个报文头变量,在报文头变量中填写报文类型等信息;并用报文类型对应的报文体数据结构定义一个报文体变量,在报文体变量中填写报文体的相关内容。因此,***设计中存在对报文头和报文体大量赋值和数据拷贝操作,这种类型的操作繁琐、重复并且容易出错。
而使用面向对象的设计方法,可以充分利用通讯报文的相同报文头、不同报文体格式的特点,采用面向对象的继承、多态、虚函数的方法,为通讯报文定义统一的对象基类,基类中包括报文头和报文体两个成员类。对应不同的报文,可以定义相同的报文头成员类,而定义不同的报文体成员类。由于对报文头和报文体的赋值操作采用对象类的成员函数进行访问,很好的封装了报文对象的内部特性和赋值、数据拷贝等操作,简化了数据操作接口,提高代码的利用率和软件的可重用性,减少了程序设计时的出错概率。
采用面向对象的方法为计算机通讯报文的处理带来了极大的便利,已经成为计算机通讯***普遍采用的设计方法。但是,在复杂通讯***中,特别是大型电信网络管理软件***中不同***模块间的通讯报文类型数量非常巨大(可能存在上千种报文类型),通常每一报文类型对应于一个从报文对象基类继承下来的对象子类,因此需要定义和处理数量如此繁多的报文对象子类。采用一般面向对象的方法,只能对报文对象类实例进行管理,而不能灵活的处理这些报文对象子类,不能对这些报文子类进行方便有效的查询、访问和处理手段,从而不仅不能充分利用面向对象的方法所带来的优势,反而会影响程序设计效率,增加***设计的复杂性。
发明内容
本发明要解决的技术问题是利用面向对象的模板特性构造一种对象类层次结构装置,为大量报文对象类的自动处理的提供有效方法,从而提高对象的访问效率,简化网络管理通讯***的复杂性,提高***模块的重用性,保证***开发的可靠性。
本发明上述技术问题这样解决,构造一种通讯报文处理方法和设备,利用这种方法和设备,可以建立一系列对象类层次结构的表示模型以及对这些对象类进行访问的处理方法,这些对象类包括描述计算机通讯***中的报文的对象类、对所有报文对象类进行统一描述的报文对象类模板和统一处理这些对象类模板所生成对象实例的类模板管理器;而本发明提供对报文对象类进行访问的处理方法使得在程序设计时可以使用统一、简洁的接口来处理数以千计的报文对象类(而不仅仅是对象实例)成为可能,从而大大降低程序设计的复杂性,提高软件的可重用性和可靠性。
按照本发明提供的基于类模板管理器的通讯报文处理设备,包括类模板管理器、与所述类模板管理器关联的类模板实例对象类单元、与所述类模板实例对象类单元关联的报文对象类单元,以及被所述报文对象类单元继承报文对象基类单元,其中,所述类模板管理器包括报文对象类的登记装置、模板实例对象类的初始化装置、用于建立模板实例对象类索引的装置、对模板实例对象类进行检索的装置、通过调用模板实例对象类创建报文对象类实例的装置、用于释放模板实例对象类的装置。
在上述设备中,所述类模板实例对象类单元包括用于创建报文对象实例的装置以及对参数初始化的装置;所述报文对象类单元包括用于报文数据的存储、对报文数据的访问和修改、报文的编解码的装置。
在按照本发明提供的基于类模板管理器的通讯报文处理方法中,类模板管理器用于对于给定的报文类型,可以方便地获取对应报文类型的类模板对象实例,从而可以根据类模板对象实例生成对应报文对象的实例,得到最终所需的报文对象实例,实现在两个或多个模块之间实现不同类型报文的通讯,该方法包括以下步骤:将报文类型编码输入到类模板管理器,登记需管理的对象类;根据登记的报文对象类,创建类模板对象实例;建立类型编码表示的报文类型到相应模板实例类模板对象实例的高效映射关系即建立类模板对象实例的索引;根据作为调用参数的报文类型,通过类模板管理器访问对应的类模板对象实例;调用类模板对象实例的方法,创建与报文类型对应的报文对象实例;调用报文对象实例的方法,对报文对象进行相关操作;对报文对象操作完成后,释放报文对象实例。
在上述方法中,所述在类模板管理器中登记所需管理的对象类,包括以下步骤:以各个报文类型编码、定义报文对象类为参数调用加到模板列表,向所述类模板管理器提供报文对象类的编码和报文对象类的定义,其中,报文类是报文基类为父类的子类。
在上述方法中,所述根据登记的对象类,创建类模板对象实例,包括以下步骤:类模板管理器自动生成以报文对象类为参数的类模板对象实例,将其存储于类模板管理器的数据区内。
在上述方法中,所述建立类模板对象实例的索引以报文类型编码作为的索引的键值(Key)。
在上述方法中,对不同报文对象的操作上的差异,通过面向对象的多态性屏蔽到了对象的成员函数中,而对于不同报文对象类的管理、操作和访问上的差异则通过采用面向对象的类模板机制进行了屏蔽。
在上述方法中,在通讯***增加报文类型X对象类时,只需在类模板管理器中登记一下该类(MsgClassX)及其代码。
在上述方法中,报文发送方的通讯模块以发送报文的类型编码作为参数,调用类模板管理器的以编码创建实例,模板管理器将以所输入报文类型的编码作为索引的值查找到类模板对象实例,通过该实例创建一个报文对象类的实例,并将此实例返回给调用它的报文发送方的通讯模块使之可按需要调用报文实例的方法填写报文内容,对报文进行编码操作,并将生成的数据流发送给报文接收方的通讯模块;报文接收方的通讯模块在接收到发送方通讯模块发送过来的数据流后,先对数据流进行解码操作以得到报文的类型,调用类模板管理器的以编码创建实例,并将报文类型编码作为参数输入方法之中,同样类模板管理器将以报文类型A的编码作为索引的值查找到类模板对象实例A,通过本实例创建一个报文对象类的实例,并将此实例返回给调用它的通讯模块,这时通讯模块可以调用此报文实例的方法,将从通讯模块接收到的数据流填入报文实例中,并通过报文实例的解码方法对数据流进行处理,得到来自报文发送方的报文内容。
实施本发明提供的基于类模板管理器的通讯报文处理设备和方法,可以用于网络管理***的通讯接口报文处理模块中,也可以用于其他应用***中。与传统的面向对象的方法相比可见,传统面向对象的方法只提供了对象实例的处理方法,而对象类的管理通常有程序设计者人工完成;本发明实现了对象类处理过程的自动化,这种方法在多对象类的应用环境,包括利用多种类型报文进行***模块间通讯的情况,为***设计和开发提供了对象类管理和访问的便利工具。
附图说明
图1是采用类模板管理器对报文对象类进行处理的方法的步骤;
图2描述了本发明建立的对象类层次结构装置;
图3是两个通讯模块使用不同类型报文进行通讯的模型;
图4是通讯模块通过本发明的类模板管理器访问报文对象的示意图。
具体实施方式
本发明提出了采用类模板管理器对报文对象类进行自动处理的方法,各个步骤如图1所示,逐个说明如下:
步骤1:在类模板管理器中登记所需管理的对象类;
如图1所示,在利用本发明实现多种报文通讯***时,***中的通讯模块先应在本发明提供的类模板管理器中登记所要使用的报文对象类。在登记报文对象类时,必须向类模板管理器提供报文对象类的编码(可以由使用者定义)和报文对象类的定义。报文类必须是以本发明定义的报文基类为父类的子类,即所用的报文类必须从报文基类继承而来,但是,由于面向对象方法所提供的继承性和多态性,这并不影响从报文基类继承下来的报文类自身对数据存储和访问方法的特殊性。在报文基类中只是统一定义了所有报文处理都共用的数据和对数据的操作方法,而继承的报文子类所需特定的数据和数据操作方法完全可以在报文子类中自己定义。
步骤2:根据登记的对象类,创建类模板对象实例;
依据步骤2本发明中的类模板管理器自动对登记的报文对象类所对应的模板实例对象类进行创建对象实例的操作,
步骤3:建立类模板对象实例的索引,并按照步骤3建立报文类型(类型编码)到相应类模板对象实例的高效映射关系。、
步骤4:根据报文类型,通过类模板管理器访问对应的类模板对象实例;
步骤5:调用类模板对象实例的方法,创建与报文类型对应的报文对象实例;
步骤6:调用报文对象实例的方法,对报文对象进行相关操作;
步骤7:对报文对象操作完成后,释放报文对象实例;
采用本发明进行通讯的***模块在使用某一类型的报文时,只需调用类模板管理器的方法,并将报文类型的编码作为方法的参数输入,类模板管理器就能按照步骤4和步骤5根据所提供的报文类型返回对应的报文对象实例。
这时使用类模板管理器的***模块就可以按照步骤6对报文对象实例进行访问和其它操作,完成操作后按照步骤7将报文对象实例释放。
本发明的对象类的层次结构装置由类模板管理器、类模板实例对象类、报文对象类构成,如图2所示。下面对对象类层次中的重要结构的功能进行描述。
类模板管理器提供的功能包括报文对象类的登记、类模板实例对象类的初始化、类模板实例对象类索引的建立、类模板实例对象类的检索、调用类模板实例对象类的方法创建报文对象类的实例、释放类模板实例对象类等工作。
类模板实例对象类提供的功能包括创建报文对象的实例、参数的初始化等工作。
报文对象类提供的功能包括报文数据的存储、对报文数据的访问和修改、报文的编解码等工作。
下面用一个电信网络管理***中通讯模块之间使用报文进行通讯的例子来说明本发明。
如图3所示,在本例中通讯模块1与通讯模块2通过报文类型A和报文类型B进行通讯,即通讯模块1向通讯模块2发送类型A报文,而通讯模块2向通讯模块1发送类型B报文,因此通讯模块1和通讯模块2都要对类型A报文和类型B报文进行处理。
通讯模块1和通讯模块2使用本发明提供的类模板管理器对类型A报文和类型B报文进行处理。根据步骤1,通讯模块1和通讯模块2都需要在类模板管理器中登记报文类型A和报文类型B,这是通过类模板管理器的加到模板列表(ADDTOTEMPLATELIST方法完成的。
在对报文类型A进行登记时,需要将报文类型A所对应的报文类型编码(比如是0x0001)和为报文类型A的定义报文对象类A(比如定义为MsgClassA)作为上述加到模板列表方法的参数输入类模板管理器,同样在对报文类型B进行登记时,需要将报文类型B所对应的报文类型编码(比如是0x0002)和为报文类型B的定义报文对象类B(比如定义为MsgClassB)作为加到模板列表方法的参数输入类模板管理器。根据步骤2,这时类模板管理器将自动生成一个以报文对象类A(比如MsgClassA)为参数的类模板对象实例A(TemplateInstanceA)和一个以报文对象类B(比如MsgClassB)为参数的类模板对象实例B(TemplateInstanceB)存储于类模板管理器的数据区内,根据步骤3类模板管理器以报文类型编码作为的键值(Key)为类模板对象实例建立索引,当存在数以千计对象实例的时候,这种索引将提高对象实例的查询和访问速度。
如图4所示,当通讯模块1需要向通讯模块2发送报文类型A的报文时,通讯模块1只需按步骤4和步骤5调用类模板管理器的以编码创建实例(CreateInstanceByCode)方法,并将报文类型A的编码(比如是0x0001)作为参数输入方法之中,这时类模板管理器将以报文类型A的编码作为索引的值查找到类模板对象实例A(TemplateInstanceA),通过本实例创建一个报文对象类A的实例1(MsgAInstancel),并将此实例返回给调用它的通讯模块1,这时通讯模块1可以根据步骤6按需要调用报文实例的方法填写报文内容,对报文进行编码操作,并将生成的数据流发送给通讯模块2。
通讯模块2在接收到通讯模块1发送过来的数据流后,先对数据流进行解码操作,以得到报文的类型,在此例中为报文类型A,通讯模块2此时只需调用类模板管理器的以编码创建实例方法,并将报文类型A的编码(比如是0x0001)作为参数输入方法之中,同样类模板管理器将以报文类型A的编码作为索引的值查找到类模板对象实例A,通过本实例创建一个报文对象类A的实例2(MsgAInstance2),并将此实例返回给调用它的通讯模块2,这时通讯模块2可以调用此报文实例的方法,将从通讯模块1接收到的数据流填入报文实例中,并通过报文实例的解码方法对数据流进行处理,最终得到从通讯模块1发送的报文内容。
根据步骤7在对报文实例的操作结束后需要对其进行释放操作。
当通讯模块2需要向通讯模块1发送报文类型B的报文时的处理与上述过程相同。
在本实施例中,如果采用传统面向对象的设计方法,只能实现对报文类型对象实例1和2(MsgAInstance1和MsgAInstance2)的管理,而对报文对象类A和B(MsgClassA和MsgClassB)的管理需要人工完成,即对报文类型A和报文类型B对象的管理过程必须在处理流程中分别进行描述,如果通讯***中增加了报文类型X对象类(MsgClassX),则这段处理流程需要重新设计以增加针对报文类型X对象类的处理流程,从而增加了***设计的重复性、复杂性,致使***可靠性下降。
而使用本发明提供的类模板管理器后,如果通讯***中增加了报文类型X对象类,只需在类模板管理器中登记一下该类(MsgClassX)和它对应的代码(例如0x000N),而所有的***流程和接口都不用修改,在使用该类型报文时只需提供报文类型对应的代码(例如0x000N)就可以了,从而提高了***模块的可重用性,降低了***设计的复杂性,提高了***设计的效率,提高了***的可靠性。