数据打包及其解包的方法

文档序号:7968495阅读:750来源:国知局
专利名称:数据打包及其解包的方法
技术领域
本发明涉及通信技术,尤其是指一种简单通用的数据打包及其解包技术。
背景技术
在通讯领域中,各种单板设备上运行的软件可能千差万别,但是基本上都是由程序文件和数据配置文件等多个文件组成。在设备正常运行维护过程中,为了新增软件功能或者修补软件漏洞,需要对单板软件进行升级,一种比较方便的软件发行方式是使用软件包,用户只要将单个软件包文件通过某种方式下载到基站主控单板上,然后由主控单板软件完成软件包的解包和具体升级工作。此外,在维护过程中往往需要从单板上上载日志文件、数据配置文件、甚至内存中的内容辅助问题定位与分析,为了方便用户操作,可以由单板软件将需要上载的数据进行打包,生成一个独立的文件,再通过某种方式上载到客户机上进行进一步的分析。出于传输速度、安全性、可靠性等方面考虑,在数据打包时还需要进行压缩、加密、文件内容完整性校验(如CRC校验)等。
但是目前常见的数据打包解包方法缺乏清晰的分层结构,现有的方法是将打包数据源数据的获取、数据的加工处理(如压缩、加密等)、数据的保存等实现逻辑混在一起,这样就导致数据打包的方法实现比较复杂。例如采用现有技术做新增一个打包数据源、替换一种压缩方法等,往往改动量很大、实现困难,而且随着代码的不断修改,代码将变得越来越晦涩难懂。
综上所述,现有技术的方法存在以下缺陷1、对于数据源的读写处理散布在对数据源处理的多个位置,层次不清楚,如果要增加新的数据源或修改数据源的读写方式,那么需要改动的地方很多,修改量很大,并由于层次不清容易操作错误;
2、现有的方案对数据源的读写和加工处理逻辑混在一起,逻辑不清晰,相互之间容易产生影响,如果对数据源进行了修改,可能会影响到数据加工处理的逻辑,而实际上两者完全是独立的,不应该造成影响;3、如果要修改数据文件的打包方式,由于现有技术中具有代码可读性和可维护性差的缺点,会造成大部分的代码都需要重写。

发明内容
本发明提供一种数据打包及其解包的方法,用以解决现有技术中存在数据打包方法层次不清晰,代码可读性和可维护性差,并且可扩展性也比较差问题。
本发明方法包括以下步骤依据打包要求,构建打包结构树;按照所建立的打包结构树调用采用抽象类CAbsStream派生的相同类型的接口,依树形从所述打包结构树的各个节点中获取数据源,在相应的接口中对获取的数据源加工处理,最终汇聚至所述打包结构树的根节点,生成打包数据流;依树形将打包过程的各个节点信息保存在打包数据流中;将保存有打包过程的各个节点信息的打包数据流写入目标文件。
本方法中,所述数据源可采用Socket协议由网络上读取或取自磁盘文件或取自内存。
本方法中,所述数据源为基本数据源或/和集合数据源。
本方法中,所述接口至少包括读接口、写接口、聚合接口以及数据加工处理接口。
本方法中,所述的目标文件为打包文件或网络数据文件,所述打包文件直接保存在本地文件中,所述网络数据文件直接由网络传输。
本方法中,还包括在需要增删打包数据中的数据源或加工处理方式时,读取打包过程的各个节点信息,在相应的接口中修改。
本方法中,所述打包过程的各个节点信息至少包括所述打包结构树中各节点的类型信息以及属性信息。
本方法中,在依树形将打包过程信息保存在打包数据流中的步骤中若所述打包结构树只具有一个根节点,在该步骤中保存根节点信息;或若所述打包结构树包含子节点,在该步骤中先保存根节点信息,再保存子树的个数以及各个子树的信息。
本发明还提供一种数据解包的方法,包括以下步骤从获取的打包文件中读取打包结构树信息;根据读取的打包结构树信息获取打包过程中各个节点信息,构造出与打包结构树对应的解包结构树;按照所述解包结构树依次读取打包文件中的数据。
本发明有益效果如下本发明的方案实现了接口与该接口具体实现的分离,接口的具体实现只需要在一个地方实现一次,然后就可以通过灵活的组合构造出不同的打包文件结构树,完全可以实现根据用户的命令完成各种打包文件结构的定制输出,使用户的应用更灵活;另外由于本发明采用了相同类型的接口使代码具有层次清晰、实现简单、具有良好可读性、可维护性、可扩展性和可移植性等优点。


图1为本发明的实施例的方法流程图;图2为本发明的实施例的派生对象类结构图;图3为本发明的实施例中数据打包的实施例;图4为图3所示的打包文件结构树的打包文件数据流示意图;图5为本发明的实施例中数据解包的实施例。
具体实施例方式
本发明提出一种具有简单通用性的数据打包及其解包方法,本发明的原理在于,通过抽象类CabsStream派生出数据打包方法中采用的各个类,如读、写类操作等,本发明中派生出的各个接口的类型相一致,在对数据进行打包或解包处理时,各个类构成的层与层之间互相不受影响,如果增加数据源或者修改读写或打包方式时,只需要修改读写接口的具体实现以及在打包过程中存储在目标流中的打包关键信息(打包过程中的各个节点信息);对接收到的数据进行解包时,只要读取打包过程中保存在目标流中的关键信息(如类名、属性等),再按照与打包方法相同的方法进行解包,得到构成打包文件的各数据源。
参考图1所示,本发明的打包方法包括以下步骤S1、依据打包要求,构建打包结构树;S2、按照所建立的打包结构树调用采用抽象类CAbsStream派生的相同类型的接口,依树形从所述打包结构树的各个节点中获取数据源,在相应的接口中对获取的数据源加工处理,最终汇聚至所述打包结构树的根节点,生成打包数据流;S3、依树形将打包过程的各个节点信息保存在打包数据流中;S4、将保存有打包过程的各个节点信息的打包数据流写入目标文件。
以下采用具体实施例对数据打包的方法作进一步说明在数据打包中,所打包的数据源可为文件,也可为内存中的数据,也可能为从网络获得的数据,而这些数据都可以看作是一种字符流,本实施例中所述的打包方法就是将一系列文件或内存数据组成的多个字符流按照建立的打包结构树进行归并处理后得到一个单一的字符流,然后将其保存到文件中或者直接通过网络进行传输,与该过程对应的处理过程就是数据解包过程。在本实施例中,进行数据打包、解包采用的所有类都是由抽象类CAbsStream派生出来,参考图2所示的内容,由CAbsStream派生出接口的构成为读接口(Read)、写接口(Write)、读信息接口(ReadSignature)、写信息接口(WriteSignature)、获得类名称接口(GetClassName)、读其它类信息接口(ReadOtherClassinfo)、写其它类信息接口(WriteOtherClassinfo)等接口,通过上述接口将多个数据聚合在一起构成集合数据源(CCollectionStream)以及对数据源的加工处理都可以采用上述接口实现,进一步实现文件或内存中的数据的打包或者解包操作。
按照图1所示的步骤,进行数据打包时,首先涉及到打包结构树的建立,打包结构树根据用户的打包需求所建立,本实施例中,用来打包的数据源可以取自本地磁盘文件或自内存(对应图2中的CFileStream和CMemoryStream)中,也可以通过Socket协议由网络上的其它终端上获得,在本实施例中,这三种数据源称为基本数据源,此外这些数据源可以进行某种组合后形成新的数据源(对应图2中的CCollectionStream,称为集合数据源),集合数据源的使用方法和基本数据源完全一致。如果以文件系统进行类比,这里的基本数据源相当于文件系统中不同类型的文件,而集合数据源则相当于目录,目录中可以包含文件和子目录。
打包结构树的建立原理是,按照打包需求中数据源的处理过程建立,结构树的建立可以采用现有技术实现。采用本方法建立的打包结构树型结构可为多种,是由需要打包的数据源的数目以及路径所确定。
以图3的例子说明结构树的建立过程,根据用户的打包要求建立结构树,假设打包要求为对数据源1和数据源2加密后与加密的数据源3共同压缩生成打包文件。依据该打包要求,建立过程为1、将基本数据源1和基本数据源2组合后形成一个集合数据源1,然后对集合数据源1进行加密后得到数据源4;2、将基本数据源3进行加密后得到数据源5;3、将数据源4和数据源5组合后形成一个集合数据源2,再对该集合数据源进行压缩最后形成打包文件。
如图4所示,为上述结构树对应的数据流示意图。
建立了打包结构树后,就可以了解对数据源的加工处理过程,即按照步骤S2的描述,调用采用抽象类CAbsStream派生的相同类型的接口按照所建立的打包结构树进行数据加工处理,生成打包数据流,表示打包过程可以参考图3中的虚线标识,打包结构树的父节点通过打包结构树的各个子节点的Read接口从子节点中获取数据,使数据逐步从打包结构树的各个子节点向父节点汇聚,并最终汇聚至根节点,形成一个单一数据流的过程。其中该打包结构树中所有子节点为基本数据源对象,分支子节点为集合数据源或者数据源加工处理对象。
在本实施例中,依据结构树将由抽象类CAbsStream派生出一系列的数据源加工处理类(也就是与读写接口相同的加工处理接口),实现对数据源的压缩、加密等功能,分别对应图2中的CCompressStream、CEncryptStream等。
参考图2,表示了本发明的方法中数据源的构成,其中包括CAbsStream数据源基类CMemoryStream内存数据源(属于基本数据源)CFileStream磁盘文件数据源(属于基本数据源)CCollectionStream集合数据源CDecoratorStream数据源加工处理基类(它可以对指定的数据源FStream实施加工处理,它是对各种数据源加工处理类共性的描述,在打包结构树中不能直接使用它,只能使用它的派生类,如CCompressStream、CEncryptStream,采用这些派生类具体对数据源进行加工处理)CCompressStream数据源压缩处理类(属于数据源加工处理类)CEncryptStream数据源加密处理类(属于数据源加工处理类)经过加工处理后得到的数据源,其用法和功能完全等效于基本数据源。
下面对图3所示的结构树的数据打包过程进行说明在本实施例中,进行数据加工处理的接口类型相同,以图3所示的结构树对数据加工处理的过程进行说明,首先通过读(Read)接口读取基本数据源1、基本数据源2以及基本数据源3,然后按照建立的结构树,将读取到的基本数据源1与其基本数据源2通过聚合接口将两数据源聚合得到集合数据源1,再分别对集合数据源1和基本数据源3进行加密处理得到数据源4以及数据源5,通过读接口再读取数据源4以及数据源5(对两数据源的读取与对基本数据源的操作相同),然后通过聚合接口将数据源4以及数据源5聚合得到集合数据源2,再对集合数据源2进行压缩处理形成打包文件。在该过程中,数据加工处理包括通过设定的接口对数据源的读取、聚合、加密以及压缩,最终形成打包数据流。
按照打包结构树形成打包数据流之后,按照步骤S3依树形将打包过程信息保存在打包数据流中的步骤中其中若所述打包结构树只具有一个根节点,在该步骤中保存根节点信息;若所述打包结构树包含子节点,在该步骤中先保存根节点信息,再保存子树的个数以及各个子树的信息。该所述打包过程的各节点信息包括每个节点的类型信息(基本数据源、集合数据源等),如保存数据源的类型名称;其次还需要保存节点的属性信息,如对于文件数据源,我们需要保存文件大小、文件名称等信息;对于内存数据源,需要保存内存的起止地址、内存大小等。形成打包数据流的过程中,由于本发明中数据源的读写以及数据加工处理采用的接口的类型完全相同,例如,CCollectionStream类中设置了一个CAbsStream对象的聚合,用来实现集合数据源的功能;在实现数据源的集合后,将被集合在成集合数据源的各子数据源的关键信息(如类名、属性等)保存在属性FSubStreams中,以便对打包数据解包。在保存属性信息时,如果是基本数据源就直接将该数据源的类信息保存到打包数据流中,如果是集合数据源,就需要保存构成该集合数据源的各个子数据源(子节点)的类信息。
保存了打包过程关键信息后执行步骤S4,即将保存有打包属性信息的打包数据流写入目标文件,完成数据打包过程。在本实施例中,所述的目标文件为打包文件或网络数据文件,所述打包文件可以直接保存在本地文件中,所述网络数据可以直接由网络传输。基本数据源中的数据根据打包结构树进行打包后形成的打包数据可以保存在各种基本数据源中,例如保存在磁盘文件数据源(CFileStream)中,该打包数据也称为打包文件;而该打包数据也可以保存在内存数据源(CMemoryStream)或者网络数据源(CSocketStream)中,实现打包文件的直接存储或者网络传输。
在本实施例中,如果打包需求发生变换,比如要增加或减少打包数据源,或者修改数据加工处理方式,可以通过操作设定的AddSubStream和RemoveSubStream接口实现聚合对象的增删。而CCollectionStream的Read/Write操作也是通过对它的子数据源调用Read/Write实现的,打包需求发生改变时,所建立的打包结构树也发生改变,采用本实施例的方法,只要在相应的接口中修改该接口的实现方式就可以实现,而无需与现有技术一样需要在多个位置进行修改。
下面举个简单的应用例子,说明本发明的数据打包方法,打包需求是将文件File1.dat和内存中的内容分别压缩后再一起进行加密最后生成打包文件packfile.dat,根据这个需求创建出一个打包结构树,按照创建的打包结构树。
按照创建的打包结构树进行的具体打包方法为读取文件数据源File1.dat的数据;压缩文件数据源数据,得到压缩后的数据D1;读取内存数据源的数据;压缩内存数据源数据,得到压缩后的数据D2;将数据源D1和D2组成一个集合数据源D3;加密集合数据源D3,得到加密后的数据D4;将打包结构树信息(各子数据源的信息)写入打包文件packfile.dat中;将数据D4写入打包文件packfile.dat中;假设在上述打包处理过程中,需要将打包后的数据直接通过网络发送出去,而不是保存在一个打包文件中,那么可以新增一个基本数据源类CSocketStream,并实现网络的读取和写入,那么只要将上面的实施例的最后两行修改为将打包结构树信息(各子数据源的信息)写入网络数据;
将数据D4写入网络数据的文件。
对于打包数据的解包,首先要读取打包文件中的打包属性信息,获知类名信息,构造打包结构树,按照打包结构树建立的逆过程获得打包数据源。解包的方法与打包方法相对应,具体为从获取的打包文件中读取打包结构树信息;根据读取的打包结构树信息获取打包过程中各个节点信息,构造出与打包结构树对应的解包结构树;按照所述解包结构树依次读取打包文件中的数据。
有关数据解包过程可以参考图5中的虚线部分,由于数据解包方法的原理与数据打包方法一致,在此不再进行赘述。
综上所述,在本发明的方案中,将数据打包中涉及到的数据源读取、数据加工处理、打包数据存储等过程进行了有效分离,每个过程都由对应的处理对象类负责处理,相互之间除了保持一致的接口之外,没有其他耦合关系,层次清晰,实现简单,代码可读性好。对于打包处理中的三个过程都可以独立地增删和修改其处理方法而不影响另外两个过程。例如,如果要新增一个基本数据源,实现从数据库中获取打包所需的数据,那么只需要新增一个数据库数据源类(CDatabaseStream),实现对指定数据库表格的读写就可以了,对于数据加工处理类无需做任何修改,就可以使用该新增的基本数据源构造打包结构树进行数据打包处理。同理,对于数据加工处理类的增删和修改也不影响基本数据源类,因此本发明具有良好的可维护性和可扩展性。此外,本发明的数据打包方法的实现对于编程语言、编译环境、应用场景等没有限制。因此本发明的方法可以应用在任何情况下,实现过程简单,并且层次清晰,具有良好的可读性、可维护性、可扩展性以及可移植性。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
权利要求
1.一种数据打包的方法,其特征在于,包括以下步骤依据打包要求,构建打包结构树;按照所建立的打包结构树调用采用抽象类CAbsStream派生的相同类型的接口,依树形从所述打包结构树的各个节点中获取数据源,在相应的接口中对获取的数据源加工处理,最终汇聚至所述打包结构树的根节点,生成打包数据流;依树形将打包过程的各个节点信息保存在打包数据流中;将保存有打包过程的各个节点信息的打包数据流写入目标文件。
2.根据权利要求1所述的方法,其特征在于,所述数据源可采用Socket协议由网络上读取或取自磁盘文件或取自内存。
3.根据权利要求1或2所述的方法,其特征在于,所述数据源为基本数据源或/和集合数据源。
4.根据权利要求1所述的方法,其特征在于,所述接口至少包括读接口、写接口、聚合接口以及数据加工处理接口。
5.根据权利要求1所述的方法,其特征在于,所述的目标文件为打包文件或网络数据文件,所述打包文件直接保存在本地文件中,所述网络数据文件直接由网络传输。
6.根据权利要求1所述的方法,其特征在于,还包括在需要增删打包数据中的数据源或加工处理方式时,读取所述打包过程的各个节点信息,在相应的接口中修改。
7.根据权利要求1或6所述的方法,其特征在于,所述打包过程的各个节点信息至少包括所述打包结构树中各节点的类型信息以及属性信息。
8.根据权利要求7所述的方法,其特征在于,在依树形将打包过程信息保存在打包数据流中的步骤中若所述打包结构树只具有一个根节点,在该步骤中保存根节点信息;或若所述打包结构树包含子节点,在该步骤中先保存根节点信息,再保存子树的个数以及各个子树的信息。
9.一种数据解包的方法,其特征在于,包括以下步骤从获取的打包文件中读取打包结构树信息;根据读取的打包结构树信息获取打包过程中各个节点信息,构造出与打包结构树对应的解包结构树;按照所述解包结构树依次读取打包文件中的数据。
全文摘要
本发明公开了一种数据打包的方法,包括以下步骤依据打包要求,构建打包结构树;按照所建立的打包结构树调用采用抽象类CAbsStream派生的相同类型的接口,依树形从所述打包结构树的各个节点中获取数据源,在相应的接口中对获取的数据源加工处理,最终汇聚至所述打包结构树的根节点,生成打包数据流;依树形将打包过程的各个节点信息保存在打包数据流中;将保存有打包过程的各个节点信息的打包数据流写入目标文件。采用本方案可以使实现数据打包的代码具有层次清晰、实现简单、具有良好可读性、可维护性、可扩展性和可移植性的优点。
文档编号H04L12/24GK1916844SQ200610127769
公开日2007年2月21日 申请日期2006年9月8日 优先权日2006年9月8日
发明者熊己兴 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1