一种java对象序列化的方法以及系统的制作方法
【技术领域】
[0001]本发明涉及Java应用远程调用技术领域,尤其涉及一种java对象序列化的方法以及系统。
【背景技术】
[0002]在一些分布式的开发程序中,为了方便使用,常常需要将Java对象以二进制作为数据进行传输。一些本地应用场景也需要将内存中的java对象以二进制的形式保存到磁盘文件中。这种将Java对象转变为二进制的行为称之为序列化。Java语言自身具备了序列化机制,然而因为使用不方便并且性能低下,故而市面上出现了许多第三方的序列化库。但是这些序列化库都不具备足够强大的性能。
【发明内容】
[0003]本发明要解决的技术问题之一,在于提供一种java对象序列化的方法,提高了序列化的性能,提高了逆序列化的速度,避免了 Java反射造成的性能损耗。
[0004]本发明问题之一是这样实现的:一种java对象序列化的方法,包括如下步骤:
[0005]步骤1、对开发程序中一个java对象进行解析,将与解析的该java对象存在引用关系的其他java对象进行集中后形成对象图,并将对象图和该对象图的根对象的信息一起当做元数据信息存储于所述根对象的元数据信息集合中;
[0006]步骤2、将根对象的元数据信息集合中所有存在引用关系的java对象进行对象实例,并存储于一对象实例集合中;
[0007]步骤3、将对象实例集合中的各对象实例进行编号,将根对象的根对象实例标记为0号,其余根据对象实例的引用关系的顺序从0后进行编号;
[0008]步骤4、将所有对象实例按编号顺序进行序列化后存储于一二进制的数据结构体中。
[0009]进一步的,所述步骤1中对开发程序中一个java对象进行解析,将与解析的该java对象存在引用关系的其他java对象进行集中后形成对象图,具体为:获取开发程序中各个java对象下所有的属性元素;判断每一个属性元素是否是基本类型,或是否是基本类型的包装类型,或是否是基本类型的数组,或是否是基本类型的包装类型的数组;都不是,则将该元素进行记录,再分析下一个对象;属性元素是四种情况中的一种,则,将属性元素集中在基本元素集合中,判断位于基本元素集合中的各个java对象对应的属性元素是否存在引用关系,是,则将存在引用关系的java对象进行集中后形成对象图,否,则不进行操作。
[0010]进一步的,所述步骤2具体为:对象图包含从根对象开始的所有对象的关联关系,以及每个对象对其他对象的依存关系;依靠对象图,给定根对象实例,从根对象出发,所有直接挂靠在根对象下的对象得到一个集合,使用这个集合信息从根对象实例中取得所有直接挂靠在根对象实例下的对象实例;每次取得的实例都放入同一个对象实例集合中;重复这个过程,直到没有新的对象被发现。
[0011]进一步的,所述步骤4具体为:将所有对象实例的类名进行序列化后存储在二进制的数据结构体的头部,按照编号顺序将所有对象实例的内容值进行序列化后存储在二进制的数据结构体的中段。
[0012]本发明要解决的技术问题之二,在于提供一种java对象序列化的系统,提高了序列化的性能,提高了逆序列化的速度,避免了 Java反射造成的性能损耗。
[0013]本发明问题之二是这样实现的:一种java对象序列化的系统,所述系统包括对象图形成模块、对象实例模块、对象实例编号模块以及序列化模块;
[0014]所述对象图形成模块,用于对开发程序中一个java对象进行解析,将与解析的该java对象存在引用关系的其他java对象进行集中后形成对象图,并将对象图和该对象图的根对象的信息一起当做元数据信息存储于所述根对象的元数据信息集合中;
[0015]所述对象实例模块,用于将根对象的元数据信息集合中所有存在引用关系的java对象进行对象实例,并存储于一对象实例集合中;
[0016]所述对象实例编号模块,用于将对象实例集合中的各对象实例进行编号,将根对象的根对象实例标记为0号,其余根据对象实例的引用关系的顺序从0后进行编号;
[0017]所述序列化模块,用于将所有对象实例按编号顺序进行序列化后存储于一二进制的数据结构体中。
[0018]进一步的,所述对象图形成模块中对开发程序中一个java对象进行解析,将与解析的该java对象存在引用关系的其他java对象进行集中后形成对象图,具体为:获取开发程序中各个java对象下所有的属性元素;判断每一个属性元素是否是基本类型,或是否是基本类型的包装类型,或是否是基本类型的数组,或是否是基本类型的包装类型的数组;都不是,则将该元素进行记录,再分析下一个对象;属性元素是四种情况中的一种,则,将属性元素集中在基本元素集合中,判断位于基本元素集合中的各个java对象对应的属性元素是否存在引用关系,是,则将存在引用关系的java对象进行集中后形成对象图,否,则不进行操作。
[0019]进一步的,所述对象实例模块具体为:对象图包含从根对象开始的所有对象的关联关系,以及每个对象对其他对象的依存关系;依靠对象图,给定根对象实例,从根对象出发,所有直接挂靠在根对象下的对象得到一个集合,使用这个集合信息从根对象实例中取得所有直接挂靠在根对象实例下的对象实例;每次取得的实例都放入同一个对象实例集合中;重复这个过程,直到没有新的对象被发现。
[0020]进一步的,所述序列化t吴块具体为:将所有对象实例的类名进彳丁序列化后存储在二进制的数据结构体的头部,按照编号顺序将所有对象实例的内容值进行序列化后存储在二进制的数据结构体的中段。
[0021]本发明具有如下优点:本发明对开发程序中java对象进行解析,将与解析的该java对象存在引用关系的其他java对象进行集中后形成对象图,从根对象的元数据信息集合中上分析对象的构成,进行对象实例;将对象实例集合中的各对象实例进行编号,将所有对象实例按编号顺序进行序列化后存储于一二进制的数据结构体中,本发明提高了序列化的性能,提高了逆序列化的速度,避免了 Java反射造成的性能损耗。
【附图说明】
[0022]图1为本发明方法流程示意图。
[0023]图2为本发明解析java对象并且生成对象图的流程示意图。
[0024]图3为本发明根据对象图得到该对象下引用的所有对象实例的流程示意图。
[0025]图4为本发明系统的结构示意图。
【具体实施方式】
[0026]请参阅图1至图3所示,本发明的一种java对象序列化的方法,包括如下步骤:
[0027]步骤1、对开发程序中一个java对象进行解析,将与解析的该java对象存在引用关系的其他java对象进行集中后形成对象图,并将对象图和该对象图的根对象(也就是对象图分析的源头)的信息一起当做元数据信息存储于所述根对象的元数据信息集合中,后续使用就不必在做分析;其中,对于一个java对象而言,其本身并不是孤立的。通常一个java对象内部可能也会有其他对象的引用。如果要完整的序列化一个java对象,则需要将其连带的java对象也都序列化。这样的一个全面的对象体系称之为对象图。
[0028]步骤2、将根对象的元数据信息集合中所有存在引用关系的java对象进行对象实例,并存储于一对象实例集合中;即从根对象出发,所关联的对象信息都在对象图中,此时根据对象图即可得到该对象下引用的所有对象实例。
[0029]步骤3、将对象实例集合中的各对象实例进行编号,将根对象的根对象实例标记为0号,其余根据对象实例的引用关系的顺序从0后进行编号;(例如:根对象实例标记为0,则下面的对象实例分别为1、2、3、4.....)之所以采用步骤3,是因为序列化对象是为了反序列化服务的。而得到整个对象实例集合,最后也是为了还原出根对象。而在反序列化的时候,这些对象实例如何拼装就成了一个问题。因为在序列化之后,每一个对象实例中对其他java对象的引用存放的是实际的内存地址,而这样的数据肯定是没办法还原的,因为还原的环境和序列化的环境是不同的。将对象实例间的引用关系采用编号进行,代替了实际的内存地址,这样在反序列化的时候,如果一个java对象需要引用另外一个java对象,只要在引用位置将编号替换成实际的对象即可。
[0030]步骤4、将所有对象实例按编号顺序进行序列化后存储于一二进制的数据结构体中。
[0031]参阅图2所示,所述步骤1中对开发程序中一个java对象进行解析,将与解析的该java对象存在引用关系的其他java对象进行集中后形成对象图,具体为:获取开发程序中各个java对象下所有的属性元素;判断每一个属性元素是否是基本类型,或是否是基本类型的包装类型,或是否是基本类型的数组,或是否是基本类型的包装类型的数组;都不是,则将该元素进行记录,再分析下一个对象;属性元素是四种情况中的一种,则,将属性元素集中在基本元素集合中,判断位于基本元素集合中的各个java对象对应的属性元素是否存在引用关系,是,则将存在引用关系的java对象进行集中后形成对象图,否,则不进行操作。
[0032]参阅图3所示,所述步骤2具体为:对象图包含从根对象开始的所有对象的关联关系。以及每个对象