公开/公告号CN105335156A
专利类型发明专利
公开/公告日2016-02-17
原文格式PDF
申请/专利权人 福建星网锐捷通讯股份有限公司;
申请/专利号CN201510690629.8
发明设计人 林斌;
申请日2015-10-22
分类号
代理机构福州市鼓楼区京华专利事务所(普通合伙);
代理人宋连梅
地址 350000 福建省福州市仓山区金山大道618号桔园洲星网锐捷科技园19-22栋
入库时间 2023-12-18 14:11:39
法律状态公告日
法律状态信息
法律状态
2019-01-15
授权
授权
2016-03-16
实质审查的生效 IPC(主分类):G06F9/44 申请日:20151022
实质审查的生效
2016-02-17
公开
公开
技术领域
本发明涉及Java应用远程调用技术领域,尤其涉及一种java对象序列 化的方法以及系统。
背景技术
在一些分布式的开发程序中,为了方便使用,常常需要将Java对象以 二进制作为数据进行传输。一些本地应用场景也需要将内存中的java对象 以二进制的形式保存到磁盘文件中。这种将Java对象转变为二进制的行为 称之为序列化。Java语言自身具备了序列化机制,然而因为使用不方便并且 性能低下,故而市面上出现了许多第三方的序列化库。但是这些序列化库都 不具备足够强大的性能。
发明内容
本发明要解决的技术问题之一,在于提供一种java对象序列化的方法, 提高了序列化的性能,提高了逆序列化的速度,避免了Java反射造成的性 能损耗。
本发明问题之一是这样实现的:一种java对象序列化的方法,包括如 下步骤:
步骤1、对开发程序中一个java对象进行解析,将与解析的该java对 象存在引用关系的其他java对象进行集中后形成对象图,并将对象图和该 对象图的根对象的信息一起当做元数据信息存储于所述根对象的元数据信 息集合中;
步骤2、将根对象的元数据信息集合中所有存在引用关系的java对象进 行对象实例,并存储于一对象实例集合中;
步骤3、将对象实例集合中的各对象实例进行编号,将根对象的根对象 实例标记为0号,其余根据对象实例的引用关系的顺序从0后进行编号;
步骤4、将所有对象实例按编号顺序进行序列化后存储于一二进制的数 据结构体中。
进一步的,所述步骤1中对开发程序中一个java对象进行解析,将与 解析的该java对象存在引用关系的其他java对象进行集中后形成对象图, 具体为:获取开发程序中各个java对象下所有的属性元素;判断每一个属 性元素是否是基本类型,或是否是基本类型的包装类型,或是否是基本类型 的数组,或是否是基本类型的包装类型的数组;都不是,则将该元素进行记 录,再分析下一个对象;属性元素是四种情况中的一种,则,将属性元素集 中在基本元素集合中,判断位于基本元素集合中的各个java对象对应的属 性元素是否存在引用关系,是,则将存在引用关系的java对象进行集中后 形成对象图,否,则不进行操作。
进一步的,所述步骤2具体为:对象图包含从根对象开始的所有对象的 关联关系,以及每个对象对其他对象的依存关系;依靠对象图,给定根对象 实例,从根对象出发,所有直接挂靠在根对象下的对象得到一个集合,使用 这个集合信息从根对象实例中取得所有直接挂靠在根对象实例下的对象实 例;每次取得的实例都放入同一个对象实例集合中;重复这个过程,直到没 有新的对象被发现。
进一步的,所述步骤4具体为:将所有对象实例的类名进行序列化后存 储在二进制的数据结构体的头部,按照编号顺序将所有对象实例的内容值进 行序列化后存储在二进制的数据结构体的中段。
本发明要解决的技术问题之二,在于提供一种java对象序列化的系统, 提高了序列化的性能,提高了逆序列化的速度,避免了Java反射造成的性 能损耗。
本发明问题之二是这样实现的:一种java对象序列化的系统,所述系 统包括对象图形成模块、对象实例模块、对象实例编号模块以及序列化模块;
所述对象图形成模块,用于对开发程序中一个java对象进行解析,将 与解析的该java对象存在引用关系的其他java对象进行集中后形成对象图, 并将对象图和该对象图的根对象的信息一起当做元数据信息存储于所述根 对象的元数据信息集合中;
所述对象实例模块,用于将根对象的元数据信息集合中所有存在引用关 系的java对象进行对象实例,并存储于一对象实例集合中;
所述对象实例编号模块,用于将对象实例集合中的各对象实例进行编 号,将根对象的根对象实例标记为0号,其余根据对象实例的引用关系的顺 序从0后进行编号;
所述序列化模块,用于将所有对象实例按编号顺序进行序列化后存储于 一二进制的数据结构体中。
进一步的,所述对象图形成模块中对开发程序中一个java对象进行解 析,将与解析的该java对象存在引用关系的其他java对象进行集中后形成 对象图,具体为:获取开发程序中各个java对象下所有的属性元素;判断 每一个属性元素是否是基本类型,或是否是基本类型的包装类型,或是否是 基本类型的数组,或是否是基本类型的包装类型的数组;都不是,则将该元 素进行记录,再分析下一个对象;属性元素是四种情况中的一种,则,将属 性元素集中在基本元素集合中,判断位于基本元素集合中的各个java对象 对应的属性元素是否存在引用关系,是,则将存在引用关系的java对象进 行集中后形成对象图,否,则不进行操作。
进一步的,所述对象实例模块具体为:对象图包含从根对象开始的所有 对象的关联关系,以及每个对象对其他对象的依存关系;依靠对象图,给定 根对象实例,从根对象出发,所有直接挂靠在根对象下的对象得到一个集合, 使用这个集合信息从根对象实例中取得所有直接挂靠在根对象实例下的对 象实例;每次取得的实例都放入同一个对象实例集合中;重复这个过程,直 到没有新的对象被发现。
进一步的,所述序列化模块具体为:将所有对象实例的类名进行序列化 后存储在二进制的数据结构体的头部,按照编号顺序将所有对象实例的内容 值进行序列化后存储在二进制的数据结构体的中段。
本发明具有如下优点:本发明对开发程序中java对象进行解析,将与解 析的该java对象存在引用关系的其他java对象进行集中后形成对象图,从根 对象的元数据信息集合中上分析对象的构成,进行对象实例;将对象实例集 合中的各对象实例进行编号,将所有对象实例按编号顺序进行序列化后存储 于一二进制的数据结构体中,本发明提高了序列化的性能,提高了逆序列化 的速度,避免了Java反射造成的性能损耗。
附图说明
图1为本发明方法流程示意图。
图2为本发明解析java对象并且生成对象图的流程示意图。
图3为本发明根据对象图得到该对象下引用的所有对象实例的流程示 意图。
图4为本发明系统的结构示意图。
具体实施方式
请参阅图1至图3所示,本发明的一种java对象序列化的方法,包括 如下步骤:
步骤1、对开发程序中一个java对象进行解析,将与解析的该java对 象存在引用关系的其他java对象进行集中后形成对象图,并将对象图和该 对象图的根对象(也就是对象图分析的源头)的信息一起当做元数据信息存 储于所述根对象的元数据信息集合中,后续使用就不必在做分析;其中,对 于一个java对象而言,其本身并不是孤立的。通常一个java对象内部可能 也会有其他对象的引用。如果要完整的序列化一个java对象,则需要将其 连带的java对象也都序列化。这样的一个全面的对象体系称之为对象图。
步骤2、将根对象的元数据信息集合中所有存在引用关系的java对象进 行对象实例,并存储于一对象实例集合中;即从根对象出发,所关联的对象 信息都在对象图中,此时根据对象图即可得到该对象下引用的所有对象实 例。
步骤3、将对象实例集合中的各对象实例进行编号,将根对象的根对象 实例标记为0号,其余根据对象实例的引用关系的顺序从0后进行编号;(例 如:根对象实例标记为0,则下面的对象实例分别为1、2、3、4…..)之所 以采用步骤3,是因为序列化对象是为了反序列化服务的。而得到整个对象 实例集合,最后也是为了还原出根对象。而在反序列化的时候,这些对象实 例如何拼装就成了一个问题。因为在序列化之后,每一个对象实例中对其他 java对象的引用存放的是实际的内存地址,而这样的数据肯定是没办法还原 的,因为还原的环境和序列化的环境是不同的。将对象实例间的引用关系采 用编号进行,代替了实际的内存地址,这样在反序列化的时候,如果一个java 对象需要引用另外一个java对象,只要在引用位置将编号替换成实际的对 象即可。
步骤4、将所有对象实例按编号顺序进行序列化后存储于一二进制的数 据结构体中。
参阅图2所示,所述步骤1中对开发程序中一个java对象进行解析, 将与解析的该java对象存在引用关系的其他java对象进行集中后形成对象 图,具体为:获取开发程序中各个java对象下所有的属性元素;判断每一 个属性元素是否是基本类型,或是否是基本类型的包装类型,或是否是基本 类型的数组,或是否是基本类型的包装类型的数组;都不是,则将该元素进 行记录,再分析下一个对象;属性元素是四种情况中的一种,则,将属性元 素集中在基本元素集合中,判断位于基本元素集合中的各个java对象对应 的属性元素是否存在引用关系,是,则将存在引用关系的java对象进行集 中后形成对象图,否,则不进行操作。
参阅图3所示,所述步骤2具体为:对象图包含从根对象开始的所有对 象的关联关系。以及每个对象对其他对象的依存关系。依靠对象图,给定根 对象实例,从根对象出发,所有直接挂靠在根对象下的对象得到一个集合, 使用这个集合信息从根对象实例中取得所有直接挂靠在根对象实例下的对 象实例。在以这些对象实例为新的根对象,以他们各自的对象图获取直接挂 靠对象实例。每次取得的实例都放入同一个对象实例集合中。重复这个过程, 直到没有新的对象被发现。
所述步骤4具体为:将所有对象实例的类名进行序列化后存储在二进制 的数据结构体的头部,按照编号顺序将所有对象实例的内容值进行序列化后 存储在二进制的数据结构体的中段。
请参阅图4所示,本发明的一种java对象序列化的系统,所述系统包 括对象图形成模块、对象实例模块、对象实例编号模块以及序列化模块;
所述对象图形成模块,用于对开发程序中一个java对象进行解析,将 与解析的该java对象存在引用关系的其他java对象进行集中后形成对象图, 并将对象图和该对象图的根对象的信息一起当做元数据信息存储于所述根 对象的元数据信息集合中;
所述对象实例模块,用于将根对象的元数据信息集合中所有存在引用关 系的java对象进行对象实例,并存储于一对象实例集合中;
所述对象实例编号模块,用于将对象实例集合中的各对象实例进行编 号,将根对象的根对象实例标记为0号,其余根据对象实例的引用关系的顺 序从0后进行编号;
所述序列化模块,用于将所有对象实例按编号顺序进行序列化后存储于 一二进制的数据结构体中。
其中,所述对象图形成模块中对开发程序中一个java对象进行解析, 将与解析的该java对象存在引用关系的其他java对象进行集中后形成对象 图,具体为:获取开发程序中各个java对象下所有的属性元素;判断每一 个属性元素是否是基本类型,或是否是基本类型的包装类型,或是否是基本 类型的数组,或是否是基本类型的包装类型的数组;都不是,则将该元素进 行记录,再分析下一个对象;属性元素是四种情况中的一种,则,将属性元 素集中在基本元素集合中,判断位于基本元素集合中的各个java对象对应 的属性元素是否存在引用关系,是,则将存在引用关系的java对象进行集 中后形成对象图,否,则不进行操作。
所述对象实例模块具体为:对象图包含从根对象开始的所有对象的关联 关系。以及每个对象对其他对象的依存关系。依靠对象图,给定根对象实例, 从根对象出发,所有直接挂靠在根对象下的对象得到一个集合,使用这个集 合信息从根对象实例中取得所有直接挂靠在根对象实例下的对象实例。在以 这些对象实例为新的根对象,以他们各自的对象图获取直接挂靠对象实例。 每次取得的实例都放入同一个对象实例集合中。重复这个过程,直到没有新 的对象被发现。
所述序列化模块具体为:将所有对象实例的类名进行序列化后存储在二 进制的数据结构体的头部,按照编号顺序将所有对象实例的内容值进行序列 化后存储在二进制的数据结构体的中段。
总之,本发明的序列化采用元对象分析方法,在序列化后会分析对象特 征,后续直接采用该特征进行序列化行为。一次分析,处处使用。且该序列 化采用私有协议,协议中去除了对象属性名称等内容,通过对元数据分析的 使用,可以保证序列化的二进制数据结构体中无包含无关信息,序列化的二 进制字节码的内容相当的少,提高了序列化的性能,提高了逆序列化的速度, 避免了Java反射造成的性能损耗。
以上所述仅为本发明的较佳实施例,凡依本发明申请专利范围所做的均 等变化与修饰,皆应属本发明的涵盖范围。
机译: 与基于Java的条件访问系统兼容的可下载条件访问系统,能够在基于XCAS的条件访问系统中增加前端系统与主机之间的兼容性,并且提供了一种兼容的方法
机译: SS Smart Suite是新开发的销售点软件,使用Java软件编写,并使用MySQL存储数据。 SS Smart Suite提供了一种组织良好的方法来管理日常运营,因为该系统允许根据服务行业的需求轻松进行自定义。它包含四个子服务的完整软件包,这些子服务为餐厅,酒店,俱乐部和酒吧提供技术帮助。这四个子服务分别称为SS SERVE,SS POS,SS GAMING和SS TAB,它们在技术上帮助服务领域的企业创建运营效率更高的公司。
机译: 一种基于文件的标准化数据库访问,企业Java Bean和内容管理系统的方法