专利名称::传递树形结构对象的方法
技术领域:
:本发明涉及传递树形结构对象的方法,更具体地涉及在C/S结构的环境下传递一个树形结构的对象的方法。
背景技术:
:在C/S结构的环境下经常需要传递一个树形结构的对象,例如在客户端需要获得服务器的目录结构,但是当这个树形结构非常巨大的情况下,通常的对象序列化的方式无法减少网络数据的传输量,即使利用了压缩技术,也不能有效地解决传输数据量的问题。在Java中,为了便利,树形结构往往利用DefaultMutableTreeNode类或其子类来表示,如果这个对象需要在网络上传输,通常的做法是利用默认的对象序列化技术,将这个对象序列化到网络流里,但是当这个树形对象非常巨大的情况下,网络上的传递效率将严重影响到应用。即使是使用了压缩技术,但其实效果并不很理想,因为通常的压缩技术对文本的压缩率很高,而对于二进制的对象,压缩率并不高。而且,直接序列化DefaultMutableTreeNode对象,里面包含了许多我们并不关心的数据,例如一些类信息,这些数据的传递对带宽也是一种浪费。也有的实现方式是将树形对象序列化为一个xml文档格式的字符串序列,但是xml文档中的结构化信息也占有较大的比例,有效数据的荷载并不高,降低了网络的有效带宽。网络传输要解决的问题就是如何减少传输的数据量。针对常用技术的一些缺陷,本发明要解决的技术问题是针对树形对象的一些特点,将树形对象序列化为一个有结构的字符串,而这个有结构的字符串的结构化信息要尽可能地小,并且要能够从这个结构化的字符串解析出树形对象,在此基础上,结合压缩技术的优势,将网络传输的数据量减少到最低。
发明内容为了解决上述技术问题,本发明提供了一种传递树形结构对象的方法,包括将所述树形结构对象序列化为有结构的字符串;将所述有结构的字符串发送至接收端;以及在所述接收端将所述字符串反序列化为所述树形结构对象。其中,将所述树形结构对象序列化为字符串的步骤可以包括定义控制字符;以及使用所述控制字符和所述树形结构对象的节点的序列化值从树的根节点开始将所述树形结构对象序列化为所述字符串。其中,控制字符可以包括父节点开始标识符、父节点结束标识符、以及叶子节点标识符。其中,在所述接收端将所述字符串反序列化为所述树形结构对象步骤包括从所述字符串中依次读取字符并判断所读取的每个字符是否为所述控制字符直到读完所述字符串的结尾;以及如果确定所读取的字符不是所述控制字符,则继续读取所述字符串,否则根据所读取的所述控制字符来确定所述树形结构对象的节点的类型,以及确定前面所读取的字符为所述树形结构对象的节点的序列化值。其中,当确定所读取的所述控制字符是所述父节点开始标识符时,将当前节点挂到当前父节点,并将所述当前父节点设置为新的当前父节点。当确定所读取的所述控制字符是所述父节点结束标识符时,表示当前父节点的所有子节点都解析完毕。当确定所读取的所述控制字符是所述叶子节点标识符时,将当前节点挂到当前父节点上。其中,字符串可以存储在接收端并利用数字摘要技术对所述字符串进行版本标示。在所述接收端请求所述树形结构对象时,利用所述版本标示确定所述树形结构对象是否为新版本;以及在所述树形结构对象为新版本时,发送所述树形结构对象对应的所述字符串,否则返回特定标识来表示所述树形结构对象不是新版本。在所述树形结构对象是新版本时,更新存储在所述接收端的所述字符串。根据本发明的传递树形结构对象的方法通过将树形对象序列化为尽可能小的有结构的字符串,并能从这个结构化的字符串反序列化为树形对象的技术来解决问题,由于网络传递的是字符串数据,所以能充分利用压缩技术的优势,进一步将网络传递数据量减到最小,有效的解决了树形对象在网络上的传递效率。图1示出了根据本发明的传递树形结构对象的方法的流程图;图2示出了根据本发明的实施例的传递树形结构对象的方法中序列化流程图;以及图3示出了根据本发明的实施例的传递树形结构对象的方法中反序列化流程图。具体实施例方式下面将参考附图详细说明根据本发明的传递树形结构对象的方法。图1示出了根据本发明的传递树形结构对象的方法的流程图。如图1所示,根据本发明的传递树形结构对象的方法包括步骤102,将树形结构对象序列化为有结构的字符串;步骤104,将有结构的字符串发送至接收端;以及步骤106,在接收端将字符串反序列化为树形结构对象。其中,步骤102可以包括定义控制字符;以及使用所述控制字符和所述树形结构对象的节点的序列化值从树的根节点开始将所述树形结构对象序列化为所述字符串。控制字符可以包括父节点开始标识符、父节点结束标识符、以及叶子节点标识符。其中,步骤106可以包括从所述字符串中依次读取字符并判断所读取的每个字符是否为所述控制字符直到读完所述字符串的结尾;以及如果确定所读取的字符不是所述控制字符,则继续读取所述字符串,否则根据所读取的所述控制字符来确定所述树形结构对象的节点的类型,以及确定前面所读取的字符为所述树形结构对象的节点的序列化值。其中,当确定所读取的所述控制字符是所述父节点开始标识符时,将当前节点挂到当前父节点,并将所述当前父节点设置为新的当前父节点。当确定所读取的所述控制字符是所述父节点结束标识符时,表示当前父节点的所有子节点都解析完毕。当确定所读取的所述控制字符是所述叶子节点标识符时,将当前节点挂到当前父节点上。其中,字符串可以存储在接收端并利用数字摘要技术对所述字符串进行版本标示。在所述接收端请求所述树形结构对象时,利用所述版本标示确定所述树形结构对象是否为新版本;以及在所述树形结构对象为新版本时,发送所述树形结构对象对应的所述字符串,否则返回特定标识来表示所述树形结构对象不是新版本。在所述树形结构对象是新版本时,更新存储在所述接收端的所述字符串。下面将结合图2描述根据本发明的实施例的传递树形结构对象的方法中序列化流程图。在图2所示的实施例中,定义了控制字符,包括父节点开始标识符,在该实施例中默认为“<”,父节点结束标识符,在该实施例中默认为“>”,以及叶子节点标识符,在该实施例中默认为“|”,其语法定义为字符串序列值=(非叶子节点||叶子节点)|(非叶子节点||叶子节点)*;非叶子节点=node<(非叶子节点||叶子节点)|(非叶子节点||叶子节点)*>;叶子节点=node|,其中“*”表示0n个,“||,,表示或者,"node"表示单个节点的序列化值。通过上面的结构化字符串可以表达任何的树形结构,并从这个字符串中解析出树形结构。在此,本领域的技术人员应该理解,可以为父节点开始标识符、父节点结束标识符以及叶子节点标识符预设默认值,而不必局限于上面的“<”、“>”和“I”。如图2所示,在步骤202,从树的根节点开始序列化;然后在步骤204判断树的根节点是否有子节点,如果没有子节点(步骤204,否),则在步骤214输出节点的序列化值,并在步骤216紧跟一个叶子节点标识符。如果确定包含有子节点(步骤204,是),则在步骤206先输出节点的序列化值,并在步骤208紧跟一个父节点开始标识符,然后在步骤210确定是否还有子节点没有输出,返回到步骤202,遍历所有的子节点递归地输出子节点的序列化值,遍历结束后,再在步骤212输出一个父节点结束标识符。图3示出了根据本发明的实施例的传递树形结构对象的方法中反序列化流程图。如图3所示,在步骤302,从字符串流里读取一个字符,在步骤304确定该字符是否为控制字符,如果这个字符不是控制字符(步骤304为否,在该实施例中为<或>或|),则表示应该继续读取流返回到步骤302,直到碰到上述三种控制字符中的一个,这表示读取到一个完整节点的序列化值,在步骤306返回一个字符串。在步骤308,确定所碰到的控制字符是否为父节点开始符合,如果碰到的是父节点开始符号(步骤308,是),则说明当前的节点是一个非叶子节点,在步骤310实例化该节点,将其挂到当前父结节点上,并设置这个节点为新的当前父节点。如果在步骤308确定所碰到的控制字符不是父节点开始符号(步骤308,否),则在步骤312确定碰到的控制字符是否为父节点结束符号,如果确定是父节点结束符号(步骤312,是)说明当前父结点的所有子节点都已经解析完毕,此时,在步骤314应该将当前父节点的父节点设置为当前父节点。如果确定不是父节点结束符号(步骤312,否),则在步骤316确定所碰到的控制字符是否为叶子节点符号,如果碰到的是叶子节点符号(步骤316,是),说明当前节点是一个叶子节点,在步骤318实例化该节点,将其挂到当前父结节点上。否则(步骤316,否)则返回到步骤301,这样一直到字符串流的结尾,就可以成功地解析出一个树形结构。成功地实现树形结构的序列化和反序列化是本方案的核心技术,由于通常的压缩算法(例如zip压缩算法)对文本字符串的压缩率相当高,所以此时再利用压缩技术对生成的字符串进行压缩来进一步减少网络的传输量。这比直接压缩二进制数据来说,压缩率会更高。对于另外一些应用场景,例如客户端需要了解服务器的某个目录结构。由于通常目录结构的变化不是很频繁,所以,可以将目录结构字符串缓存在客户端,并利用数字摘要技术对其进行版本标示。这样,在向服务器请求目录结构时,同时向服务器发送本地缓存的版本,服务器接收到请求后,也先将服务器目录结构序列化,并计算其版本,如果发现服务器端版本和客户端版本不一致时,向客户端传递新的目录结构序列化字符串,如果发现服务器端版本和客户端版本一致,那么向客户端返回一个特殊标识。在客户端,当发现接收到的是一个特殊标识,表明目录结构没有发生变化,可以使用缓存的目录结构,而当发现接收到一个新的序列化字符串时,则说明目录结构发生了变化,应使用新的目录结构更新本地缓存。这样,在实际的环境中,大多数情况下,如果树形结构没有发生变化,则不论这个树形结构到底有多大,在网络上发生的数据流量也是非常小的,大概30个子节而已(利用数字摘要标识版本,其版本长度一般是1620个子节长)。这样就最大程度地降低了网络负荷。根据本发明的方法应用在产品中的多语言模块中。在多语言实现方案中,当客户端在初始化的时候,需要了解服务器上的多语言资源的目录化的结构,以便对多语言资源进行初始化。而通常,多语资源的目录结构是直接传递对象的方式进行,然而,随着产品多语化的发展,这个目录结构已经变得越来越大了,以前的技术方案已经不能满足需要,在客户端多语言资源目录结构的初始化过程中,传递服务器多语言资源目录结构已经影响到客户端的初始化效率了。为了解决这个问题,应用了本发明中的技术,将树形结构序列化为一个字符串,这样既能减少一部分不必要的数据,又能更加充分地利用压缩技术的威力,进一步地减少了网络上的数据传输量。再利用客户端的缓存技术,当服务器目录结构没有变化时,直接从本地缓存读取,将网络传递量降到最低。在产品中使用本发明,在使用之前,客户端需要下载服务器上的多语言资源目录树结构,在一些环境上,需要45秒时间,特别是在广域网的应用环境下,至少需要10多秒的时间,而应用了此方案后,最多也就需要消费几百毫秒,而在服务器目录结构没有变化的条件下,更是可以忽略不计的程度。以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。权利要求一种传递树形结构对象的方法,其特征在于,包括将所述树形结构对象序列化为有结构的字符串;将有结构的所述字符串发送至接收端;以及在所述接收端将所述字符串反序列化为所述树形结构对象。2.根据权利要求1所述的传递树形结构对象的方法,其特征在于,所述将所述树形结构对象序列化为字符串的步骤包括定义控制字符;以及使用所述控制字符和所述树形结构对象的节点的序列化值从树的根节点开始将所述树形结构对象序列化为所述字符串。3.根据权利要求2所述的传递树形结构对象的方法,其特征在于,所述控制字符包括父节点开始标识符、父节点结束标识符、以及叶子节点标识符。4.根据权利要求2或3所述的传递树形结构对象的方法,其特征在于,所述在所述接收端将所述字符串反序列化为所述树形结构对象步骤包括从所述字符串中依次读取字符并判断所读取的每个字符是否为所述控制字符直到读完所述字符串的结尾;以及如果确定所读取的字符不是所述控制字符,则继续读取所述字符串,否则根据所读取的所述控制字符来确定所述树形结构对象的节点的类型,以及确定前面所读取的字符为所述树形结构对象的节点的序列化值。5.根据权利要求4所述的传递树形结构对象的方法,其特征在于,当确定所读取的所述控制字符是所述父节点开始标识符时,将当前节点挂到当前父节点,并将所述当前父节点设置为新的当前父节点。6.根据权利要求4所述的传递树形结构对象的方法,其特征在于,当确定所读取的所述控制字符是所述父节点结束标识符时,表示当前父节点的所有子节点都解析完毕。7.根据权利要求4所述的传递树形结构对象的方法,其特征在于,当确定所读取的所述控制字符是所述叶子节点标识符时,将当前节点挂到当前父节点上。8.根据权利要求1所述的传递树形结构对象的方法,其特征在于,进一步包括所述字符串存储在所述接收端并利用数字摘要技术对所述字符串进行版本标示。9.根据权利要求8所述的传递树形结构对象的方法,其特征在于,进一步包括在所述接收端请求所述树形结构对象时,利用所述版本标示确定所述树形结构对象是否为新版本;以及在所述树形结构对象为新版本时,发送所述树形结构对象对应的所述字符串,否则返回特定标识来表示所述树形结构对象不是新版本。10.根据权利要求9所述的传递树形结构对象的方法,其特征在于,进一步包括在所述树形结构对象是新版本时,更新存储在所述接收端的所述字符串。全文摘要本发明提供了一种传递树形结构对象的方法,包括将树形结构对象序列化为有结构的字符串;将有结构的字符串发送至接收端;以及在接收端将所述字符串反序列化为所述树形结构对象。根据本发明的传递树形结构对象的方法通过将树形对象序列化为尽可能小的有结构的字符串,并能从这个结构化的字符串反序列化为树形对象的技术来解决问题,由于网络传递的是字符串数据,所以能充分利用压缩技术的优势,进一步将网络传递数据量减到最小,有效的解决了树形对象在网络上的传递效率。文档编号G06F17/30GK101876990SQ20091023691公开日2010年11月3日申请日期2009年10月27日优先权日2009年10月27日发明者李充蒲申请人:用友软件股份有限公司