论坛首页 Java企业应用论坛

bboss 序列化功能详解

浏览 6883 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-01-27   最后修改:2012-02-13
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包,可点击链接下载
bboss-aop.jar
cglib-2.2.jar
frameworkset-util.jar
log4j-1.2.14.jar
bboss-soa.jar

2.Bboss 序列化功能特点

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

3.Bboss 序列化功能使用
本小节以一个简单的实例来说明如何通过bboss来实现组件序列化功能.
3.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);


3.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);


3.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);


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

4.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 的版本是3.5。

测试代码附下:

@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();
		}
	}

   发表时间:2012-01-29  
请问bboss序列化的性能如何?与Hessian相比呢?
0 请登录后投票
   发表时间:2012-01-29  
evanzzy 写道
请问bboss序列化的性能如何?与Hessian相比呢?


bboss序列化功能和xstream都采用xml格式对java对象进行序列化,相较xstream效率要搞一些;hession采用二进制格式进行序列化,因此序列化效率要比bboss高一些,但是bboss产生的报文是xml格式,可读性非常好。
0 请登录后投票
   发表时间:2012-01-30   最后修改:2012-01-30
为了验证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 的版本是3.5。

测试代码附下:
@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();
		}
	}
0 请登录后投票
   发表时间:2012-01-31  
非常感谢您的耐心回复,可见您对这个框架项目是比较重视的。其实我半年以前就仔细的看了这个框架,感觉真的是很不错的,功能相当齐全,文档比较完整,看到出来倾注了相当大的工作量。没有一两年时间是做不出来这个规模的技术框架的。

不过也要谈一点个人看法:在我看来Bboss的开发策略是完全自主开发,除了前端页面,后台代码基本没有使用知名的开源框架例如Spring、Struts、iBatis等。如果使用这个框架做项目开发,风险实在是无法估算,因为都是你们自己写的东西,如果出现问题,无法像Spring那样有完善的社区支持和大量的实践经验。我又不可能把这个框架这么多代码都看完,而且人员的培训也是个问题,后续的扩展开发也是问题。

我还是觉得应该适当采用成熟且使用广泛的开源框架作为基础,自己做的话,如果不能比已有的知名产品更好的话,必要性是并不大的。就像这个序列化功能,其实你的测试并不是很严谨,而且并没有明显超越hessian的地方。可以看一下alibaba这个项目,这个测试还是比较有说服力的。虽然我佩服你的高水平,但并不认为什么东西都自己做是对的。
http://code.alibabatech.com/wiki/display/dubbo/User+Guide
0 请登录后投票
   发表时间:2012-01-31   最后修改:2012-02-02
感谢evanzzy的点评和关注,bbossgroups一直在不断地完善和前进,不断地学习,他的作者把开发bboss系列框架当做是一种兴趣爱好,立足本身的基础体系拓展bboss的功能,力图将其做的更好更完善,力求走自己的路线,按自己的想法去做,呵呵,至于结果如何,有没有必要这个作者没有做过多的考虑。

由于时间的仓促,序列化功能的测试确实没有做得太严谨,还请见谅,bboss的序列化功能只是bbossgroups框架体系中的一个附属产品,是在开发bboss rpcbboss aop的同时顺带开发出来的,只是做了个尝试,呵呵,刚好趁evanzzy的提问就和hessian做了个对比测试,目前bboss rpc也支持多种协议:mina,netty,http,rmi,jms,webservice,jgroups,同时还支持路由协议,底层的序列化目前支持bboss自带的序列化、hessian序列化。做这些东西的出发点一个是想尝试一下,另一个就是确实在项目中都用得上,所以就花了点业余时间把bboss体系开发出来了,做的不好,大家可以拍砖啊,我很希望有人拍砖哦。

阿里的duboo确实不错,这是个经过实践检验的rpc框架,他的文档也不错,我仔细看了,有很多bboss rpc学习的地方,有空也会将服务的软集群功能和服务自动发现治理做到bboss rpc中,没啥别的目的,就是想把bboss rpc做的更加完善,呵呵。
0 请登录后投票
   发表时间:2012-01-31   最后修改:2012-02-01
同时为了弥补bbossgroups做为一个新生框架社区力量不够的现状,我尽量在写一些介绍性的使用文档和完善框架的测试用例,力图做的更好,同时也在加强官方网站建设。
0 请登录后投票
   发表时间:2012-02-01  
能够坚持走自己的路,确实不容易,祝顺利。

继续关注Bboss的发展,祝你成功!
0 请登录后投票
   发表时间:2012-02-01  
你就是把bboss做的再好有什么用呢?我们看的这个框架都有两面性,你一开始的做这个的初衷是什么?难道就是兴趣嘛?兴趣可以很多,问题是这个框架再过10年,有人维护嘛?呵呵,但是spring这个框架是有稳定的社区可以维护的。

我不可否认,你把重复的工作做了一遍感觉很有成就感,但是这样带来的问题就是别人并没有做一遍,这个只是你的一厢情愿罢了。
0 请登录后投票
   发表时间:2012-02-01   最后修改:2012-02-01
首先要感谢bao123的鞭策和质疑,简单答复一下下:
1.构建bboss的驱动力主要来自本人对开源的热爱以及项目实际需求的驱动
2.至于把bboss做好有什么用,肯定是有用无害了,做好了能够更好地为我们的项目服务,不是很好吗,难道有人不想把自己的事情做好啊
2.至于社区的问题,bboss已经从无到有,我相信社区也会从无到有的
3.至于持续性问题,我们会持之以恒做好内部项目支撑,做好文档建设工作;同时借助博客等渠道做好知识管理和积累以及共享工作

4.至于下面这句话,我没明白是嘛意思,还请bao123指点一下:
引用
bao123:我不可否认,你把重复的工作做了一遍感觉很有成就感,但是这样带来的问题就是别人并没有做一遍,这个只是你的一厢情愿罢了。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics