CN105335156A - 一种java对象序列化的方法以及系统 - Google Patents
一种java对象序列化的方法以及系统 Download PDFInfo
- Publication number
- CN105335156A CN105335156A CN201510690629.8A CN201510690629A CN105335156A CN 105335156 A CN105335156 A CN 105335156A CN 201510690629 A CN201510690629 A CN 201510690629A CN 105335156 A CN105335156 A CN 105335156A
- Authority
- CN
- China
- Prior art keywords
- java
- root
- diagram
- instance
- carried out
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供一种java对象序列化的方法,该方法为:1、对开发程序中一个java对象进行解析,将与解析的该java对象存在引用关系的其他java对象进行集中后形成对象图,并将对象图和该对象图的根对象的信息一起当做元数据信息存储于所述根对象的元数据信息集合中;2、将根对象的元数据信息集合中所有存在引用关系的java对象进行对象实例,并存储于一对象实例集合中;3、将对象实例集合中的各对象实例进行编号,将根对象的根对象实例标记为0号,其余根据对象实例的引用关系的顺序从0后进行编号;4、将所有对象实例按编号顺序进行序列化后存储于一二进制的数据结构体中。本发明提高了序列化的性能,提高了逆序列化的速度,避免了Java反射造成的性能损耗。
Description
技术领域
本发明涉及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反射造成的性能损耗。
以上所述仅为本发明的较佳实施例,凡依本发明申请专利范围所做的均等变化与修饰,皆应属本发明的涵盖范围。
Claims (8)
1.一种java对象序列化的方法,其特征在于:包括如下步骤:
步骤1、对开发程序中一个java对象进行解析,将与解析的该java对象存在引用关系的其他java对象进行集中后形成对象图,并将对象图和该对象图的根对象的信息一起当做元数据信息存储于所述根对象的元数据信息集合中;
步骤2、将根对象的元数据信息集合中所有存在引用关系的java对象进行对象实例,并存储于一对象实例集合中;
步骤3、将对象实例集合中的各对象实例进行编号,将根对象的根对象实例标记为0号,其余根据对象实例的引用关系的顺序从0后进行编号;
步骤4、将所有对象实例按编号顺序进行序列化后存储于一二进制的数据结构体中。
2.根据权利要求1所述的一种java对象序列化的方法,其特征在于:所述步骤1中对开发程序中一个java对象进行解析,将与解析的该java对象存在引用关系的其他java对象进行集中后形成对象图,具体为:获取开发程序中各个java对象下所有的属性元素;判断每一个属性元素是否是基本类型,或是否是基本类型的包装类型,或是否是基本类型的数组,或是否是基本类型的包装类型的数组;都不是,则将该元素进行记录,再分析下一个对象;属性元素是四种情况中的一种,则,将属性元素集中在基本元素集合中,判断位于基本元素集合中的各个java对象对应的属性元素是否存在引用关系,是,则将存在引用关系的java对象进行集中后形成对象图,否,则不进行操作。
3.根据权利要求1所述的一种java对象序列化的方法,其特征在于:所述步骤2具体为:对象图包含从根对象开始的所有对象的关联关系,以及每个对象对其他对象的依存关系;依靠对象图,给定根对象实例,从根对象出发,所有直接挂靠在根对象下的对象得到一个集合,使用这个集合信息从根对象实例中取得所有直接挂靠在根对象实例下的对象实例;每次取得的实例都放入同一个对象实例集合中;重复这个过程,直到没有新的对象被发现。
4.根据权利要求1所述的一种java对象序列化的方法,其特征在于:所述步骤4具体为:将所有对象实例的类名进行序列化后存储在二进制的数据结构体的头部,按照编号顺序将所有对象实例的内容值进行序列化后存储在二进制的数据结构体的中段。
5.一种java对象序列化的系统,其特征在于:所述系统包括对象图形成模块、对象实例模块、对象实例编号模块以及序列化模块;
所述对象图形成模块,用于对开发程序中一个java对象进行解析,将与解析的该java对象存在引用关系的其他java对象进行集中后形成对象图,并将对象图和该对象图的根对象的信息一起当做元数据信息存储于所述根对象的元数据信息集合中;
所述对象实例模块,用于将根对象的元数据信息集合中所有存在引用关系的java对象进行对象实例,并存储于一对象实例集合中;
所述对象实例编号模块,用于将对象实例集合中的各对象实例进行编号,将根对象的根对象实例标记为0号,其余根据对象实例的引用关系的顺序从0后进行编号;
所述序列化模块,用于将所有对象实例按编号顺序进行序列化后存储于一二进制的数据结构体中。
6.根据权利要求5所述的一种java对象序列化的系统,其特征在于:所述对象图形成模块中对开发程序中一个java对象进行解析,将与解析的该java对象存在引用关系的其他java对象进行集中后形成对象图,具体为:获取开发程序中各个java对象下所有的属性元素;判断每一个属性元素是否是基本类型,或是否是基本类型的包装类型,或是否是基本类型的数组,或是否是基本类型的包装类型的数组;都不是,则将该元素进行记录,再分析下一个对象;属性元素是四种情况中的一种,则,将属性元素集中在基本元素集合中,判断位于基本元素集合中的各个java对象对应的属性元素是否存在引用关系,是,则将存在引用关系的java对象进行集中后形成对象图,否,则不进行操作。
7.根据权利要求5所述的一种java对象序列化的系统,其特征在于:所述对象实例模块具体为:对象图包含从根对象开始的所有对象的关联关系,以及每个对象对其他对象的依存关系;依靠对象图,给定根对象实例,从根对象出发,所有直接挂靠在根对象下的对象得到一个集合,使用这个集合信息从根对象实例中取得所有直接挂靠在根对象实例下的对象实例;每次取得的实例都放入同一个对象实例集合中;重复这个过程,直到没有新的对象被发现。
8.根据权利要求5所述的一种java对象序列化的系统,其特征在于:所述序列化模块具体为:将所有对象实例的类名进行序列化后存储在二进制的数据结构体的头部,按照编号顺序将所有对象实例的内容值进行序列化后存储在二进制的数据结构体的中段。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510690629.8A CN105335156B (zh) | 2015-10-22 | 2015-10-22 | 一种java对象序列化的方法以及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510690629.8A CN105335156B (zh) | 2015-10-22 | 2015-10-22 | 一种java对象序列化的方法以及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105335156A true CN105335156A (zh) | 2016-02-17 |
CN105335156B CN105335156B (zh) | 2019-01-15 |
Family
ID=55285723
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510690629.8A Active CN105335156B (zh) | 2015-10-22 | 2015-10-22 | 一种java对象序列化的方法以及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105335156B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108920179A (zh) * | 2017-04-12 | 2018-11-30 | 中国移动通信集团福建有限公司 | Java反射实现方法、装置和系统 |
CN112422403A (zh) * | 2020-10-15 | 2021-02-26 | 中标慧安信息技术股份有限公司 | 一种基于即时通讯快速集成网络同步电子白板的实现方法 |
CN116126429A (zh) * | 2022-12-06 | 2023-05-16 | 谷斗科技(上海)有限公司 | 一种非数据类型对象的引用持久化及其恢复的方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080162511A1 (en) * | 2006-12-30 | 2008-07-03 | Theobald Dietmar C | Computer file system traversal |
CN101876990A (zh) * | 2009-10-27 | 2010-11-03 | 用友软件股份有限公司 | 传递树形结构对象的方法 |
CN103019689A (zh) * | 2012-11-21 | 2013-04-03 | 上海富欣智能交通控制有限公司 | 通用的对象序列化的实现方法 |
CN103593194A (zh) * | 2013-11-21 | 2014-02-19 | 北京国双科技有限公司 | 对象序列化方法和装置 |
-
2015
- 2015-10-22 CN CN201510690629.8A patent/CN105335156B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080162511A1 (en) * | 2006-12-30 | 2008-07-03 | Theobald Dietmar C | Computer file system traversal |
CN101876990A (zh) * | 2009-10-27 | 2010-11-03 | 用友软件股份有限公司 | 传递树形结构对象的方法 |
CN103019689A (zh) * | 2012-11-21 | 2013-04-03 | 上海富欣智能交通控制有限公司 | 通用的对象序列化的实现方法 |
CN103593194A (zh) * | 2013-11-21 | 2014-02-19 | 北京国双科技有限公司 | 对象序列化方法和装置 |
Non-Patent Citations (2)
Title |
---|
晏立等: "java序列化技术的探讨", 《红河学院学报》 * |
许晖: "应用XML实现Java对象序列化技术简述", 《JAVA技术及应用的进展-第七届中国JAVA技术及应用交流大会文集》 * |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108920179A (zh) * | 2017-04-12 | 2018-11-30 | 中国移动通信集团福建有限公司 | Java反射实现方法、装置和系统 |
CN112422403A (zh) * | 2020-10-15 | 2021-02-26 | 中标慧安信息技术股份有限公司 | 一种基于即时通讯快速集成网络同步电子白板的实现方法 |
CN116126429A (zh) * | 2022-12-06 | 2023-05-16 | 谷斗科技(上海)有限公司 | 一种非数据类型对象的引用持久化及其恢复的方法 |
CN116126429B (zh) * | 2022-12-06 | 2023-11-17 | 谷斗科技(上海)有限公司 | 一种非数据类型对象的引用持久化及其恢复的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN105335156B (zh) | 2019-01-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9460188B2 (en) | Data warehouse compatibility | |
US9953071B2 (en) | Distributed storage of data | |
JP6667931B2 (ja) | 音声情報から時間情報を認識するための方法およびデバイス | |
CN106970929B (zh) | 数据导入方法及装置 | |
CN104090889A (zh) | 数据处理方法及系统 | |
CN104899199A (zh) | 一种数据仓库数据处理方法和系统 | |
CN103714004A (zh) | Jvm在线内存泄露分析方法及系统 | |
US20150089415A1 (en) | Method of processing big data, apparatus performing the same and storage media storing the same | |
CN109344193B (zh) | 一种将结构化数据转化为非结构化数据的方法及系统 | |
CN103699637A (zh) | 一种代码生产率统计方法及其系统 | |
CN103425632A (zh) | 一种序列化的方法、装置及处理器 | |
US20180060364A1 (en) | Database scheme for storing generic data | |
CN105335156A (zh) | 一种java对象序列化的方法以及系统 | |
US11003845B2 (en) | Systems and methods for reduced memory usage when processing spreadsheet files | |
CN104516921A (zh) | 自动回复方法及装置 | |
CN109656797B (zh) | 日志数据的关联方法及装置 | |
WO2017097159A1 (zh) | 一种随机字符串生成方法及装置 | |
CN107729375B (zh) | 一种日志数据排序的方法及装置 | |
CN104881461A (zh) | 一种快速数据保存方法 | |
US9026548B2 (en) | Database sampling | |
CN101645073A (zh) | 一种将已有数据库文件导入嵌入式数据库的方法 | |
CN106649210B (zh) | 一种数据转换方法及装置 | |
CN105468661A (zh) | 一种查找elf文件中符号信息的方法及系统 | |
CN104537148A (zh) | Pdms模型中螺栓信息的统计方法 | |
CN106202440A (zh) | 数据处理方法、装置及设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |