bboss 序列化功能详解

简介: bboss 序列化功能详解,bboss序列化组件是bbossgroups框架体系中的又一个非常给力的功能构件,可以非常方便地实现对象到xml的相互转换功能,本文详细介绍bboss序列化功能的特点及使用方法。
bboss 序列化功能详解,bboss序列化组件是bbossgroups框架体系中的又一个非常给力的功能构件,可以非常方便地实现对象到xml的相互转换功能,本文详细介绍bboss序列化功能的特点及使用方法。

1.Bboss 序列化功能组件及依赖的jar包

1.1 主要组件和注解
组件
org.frameworkset.soa.ObjectSerializable
ObjectSerializable组件提供了序列化和反序列化的主要api:
序列化api
//将对象obj序列化成xml串并返回该串
public final static String toXML(Object obj)
//将对象obj序列化成xml串,并将该串写入到Writer对象out中
public final static void toXML(Object obj, Writer out)


反序列化api
//将beanxml参数对应的xml串转换为beantype类型的对象并返回该对象,采用泛型方式
public static <T> T toBean(String beanxml, Class<T> beantype)
//将instream参数对应的xml字符流转换为beantype类型的对象并返回该对象,采用泛型方式
public static <T> T toBean(InputStream instream, Class<T> beantype)


注解
org.frameworkset.soa.annotation.ExcludeField

ExcludeField注解主要的作用就是用来过滤对象中不需要序列化的属性,目前只对对象属性起作用,后续可以加到get方法。ExcludeField注解的作用类似于java保留字transient的作用,bboss序列化组件同样也支持transient关键字,只要属性前面加了transient关键字,序列化时也会被忽略。ExcludeField用法如下:
@ExcludeField
private String excludeField


1.2 依赖的jar包,可点击链接下载,如果地址无法访问,也可以点击每个jar文件上的连接从github下载
bboss-core.jar
cglib-nodep-2.2.jar
frameworkset-util.jar
log4j-1.2.16.jar
bboss-soa.jar
jakarta-oro-2.0.8.jar

2.Bboss 序列化功能特点

(1).支持高效的xml-bean相互转换(序列化和反序列化)
(2).支持各种数据类型的序列化和反序列化,支持文件的序列化和反序列化
(3).支持对象间各种关系的序列化和反序列化(对象恢复后能够恢复对象间的引用关系以及循环递归引用关系,例如树结构的对象关系,单向父子对象关系,双向父子对象关系)
(4).序列化时可以过滤以下类型属性:
transient
static
final
@Exclude注解过的属性

3.指定序列化过程中可以忽略的异常信息,以换行符分割
在配置文件/resources/org/frameworkset/soa/serialconf.xml的ignoreExceptions节点中进行设置:
<property name="ignoreExceptions">
		<![CDATA[
		org.frameworkset.soa.IgnoreException1
		org.frameworkset.soa.IgnoreException2
		]]>
	</property>

默认忽略org.hibernate.LazyInitializationException异常

4.Bboss 序列化功能使用
本小节以一个简单的实例来说明如何通过bboss来实现组件序列化功能.
4.1 首先看简单对象序列化和反序列化操作
//构建和初始化要序列化的简单对象实例
TransientFieldBean transientFieldBean = new TransientFieldBean("onlyField");
		transientFieldBean.setExcludeField("exccc");
		transientFieldBean.setStaticFiled("staticFiled");
		transientFieldBean.setTransientField("transientField");
//对象序列化
		String xml = ObjectSerializable.toXML(transientFieldBean);
//反序列化
		TransientFieldBean transientFieldBean_new = ObjectSerializable.toBean(xml, TransientFieldBean.class);


4.2 再看一个复杂对象数据结构的序列化和反序列化操作
//构建和初始化要序列化的复杂对象实例,对象test1引用对象test2和test3,test2引
//用test1,对象test3引用对象test2,这样就构造了一个具有相互引用的关系网,
//bboss序列化组件可以非常方便地对这种结构的对象进行序列化和反序列化,而且能够
//很好地保持这种复杂的引用关系
Test1 test1 = new Test1();
		Test2 test2 = new Test2();
		Test3 test3 = new Test3();
		test2.setTest1(test1);
		test1.setTest2(test2);
		test1.setTest3(test3);
		test3.setTest2(test2);
//序列化test1对象
		String ss = ObjectSerializable.toXML(test1);
//反序列化
		Test1 test1_ =  (Test1)ObjectSerializable.toBean(ss,Test1.class);


4.3 再看一个文件对象的序列化和反序列化操作

//构造一个带文件属性的对象joe
File fileData = new File("D:\\workspace\\bbossgroups-3.2\\bboss-soa\\test\\org\\frameworkset\\soa\\testxstream.xml");
FilePerson joe = new FilePerson();
		joe.setFileData(fileData);
//序列化对象joe
String xml = ObjectSerializable.toXML(joe);
//反序列化
FilePerson person = ObjectSerializable.toBean( xml, FilePerson.class);


更详细的实例请参考 测试用例

5.Bboss 序列化功能应用

bboss序列化功能目前已经被广泛应用于基于http/netty/mina/webservice/jms 等通讯协议的rpc框架中,性能表现良好。

参考文档:
bbossgroups 对象xml序列化/反序列化性能测试
bboss 序列化机制重大改进-支持复杂对象及对象之间关系序列化和恢复功能


为了验证hessian和bboss序列化功能的差异性特意做了个对比测试。
分别用bboss和hessian序列化和反序列化带有47K数据的对象实例,测试结果如下:

bboss:序列化生成数据大小48274byte,耗时:47毫秒
hessian:序列化生成数据大小47801byte,耗时:62毫秒
bboss 反序列化耗时:125毫秒
hessian 反序列化耗时:32毫秒

从测试结果来看,bboss序列化速度比hessian稍快,反序化比hessian慢4倍,序列化产生的数据大小比hessian略大一些。

hessian的版本是4.0.7,bboss 的版本是4.0.7。

测试代码附下:

@Test
	public void testHessianSerializable() throws Exception
	{
		Test1 test1 = new Test1();
		Test2 test2 = new Test2();
		Test3 test3 = new Test3();
		test2.setTest1(test1);
		test1.setTest2(test2);
		test1.setTest3(test3);
		test3.setTest2(test2);
		try
		{
			String bigcontent = FileUtil.getFileContent(new File("D:\\workspace\\bbossgroups-3.5\\bboss-soa\\test\\org\\frameworkset\\soa\\testxstream.xml"), "GBK");//testxstream.xml是一个47K大小的xml文件
			test1.setXmlvalue(bigcontent);
			long s = System.currentTimeMillis();
			String xml = ObjectSerializable.toXML(test1);//bboss 序列化
			long e = System.currentTimeMillis();
			System.out.println("bboss:"+xml.getBytes().length + ",times:" + (e - s));
			s = System.currentTimeMillis();
			Test1 test1_ =  (Test1)ObjectSerializable.toBean(xml,Test1.class);//bboss 反序列化
			e = System.currentTimeMillis();
			System.out.println("bboss de times:" + (e - s));
			s = System.currentTimeMillis();//hessian序列化
			ByteArrayOutputStream os = new ByteArrayOutputStream();   
			HessianOutput ho = new HessianOutput(os);   
			ho.writeObject(test1);   
			byte[] cs = os.toByteArray();   
			e = System.currentTimeMillis();

			System.out.println("hessian:"+cs.length+ ",times:" + (e - s));
			s = System.currentTimeMillis();//hessian反序列化
			ByteArrayInputStream is = new ByteArrayInputStream(cs);   
			 HessianInput hi = new HessianInput(is);   
			 test1_ =  (Test1) hi.readObject();   
			 e = System.currentTimeMillis();
				System.out.println("hessian de times:" + (e - s));
			
			//测试用例结束
			
			
		}
		catch (Exception e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}




目录
相关文章
|
XML 数据格式 Java
bboss序列化cglib代理对象方法介绍
本文介绍bboss序列化cglib代理对象方法。经过cglib代理过的po类对象实例是原来po对象的子类对象,bboss在序列化这种对象时,需要经过特殊处理,否则会出现不可预知的错误,导致序列化失败,典型的例子就是hibernate查询操作返回的po对象就是cglib代理对象。
1191 0
|
存储 Java BI
bboss session共享时序列化存储jasperreports报表对象JasperPrint方法
bboss session共享时序列化存储jasperreports报表对象JasperPrint方法bboss session共享组件使用方法介绍 由于JasperPrint对象有点特殊,序列化存储到session时,必须采用java自带的序列化机来序列化和还原JasperPrint对象,否则bboss序列化机制无法实现对原始JasperPrint对象的序列化。
947 0
|
XML Java 测试技术
bboss 序列化机制重大改进-支持复杂对象及对象之间关系序列化和恢复功能
bboss 序列化机制重大改进-支持复杂对象及对象之间关系序列化和恢复功能,支持对象循环引用/自引用关系的序列化和反序列化,在此发文介绍一下这个功能。 首先看一下如何构造一组复杂对象: Test1 test1 = new Test1(); Test2 test2 = new Test2(); Test3 test3 = new Test3(); test2.
780 0
|
XML 大数据 测试技术
Bboss和xstream序列化/反序列化性能对比
Bboss和xstream序列化/反序列化性能对比 本报告分别测试bboss和xstream的序列化和反序列化功能,测试的接口如下: 1.接口方法 Bboss序列化和反序列化方法 //序列化 String xml = ObjectSerializable.
1028 0
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
18天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
28天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
1月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。