Bboss和xstream序列化/反序列化性能对比

简介: Bboss和xstream序列化/反序列化性能对比 本报告分别测试bboss和xstream的序列化和反序列化功能,测试的接口如下: 1.接口方法 Bboss序列化和反序列化方法 //序列化 String xml = ObjectSerializable.
Bboss和xstream序列化/反序列化性能对比
本报告分别测试bboss和xstream的序列化和反序列化功能,测试的接口如下:
1.接口方法
Bboss序列化和反序列化方法
 
//序列化
String xml =
 ObjectSerializable.toXML(joe);
//反序列化
Person p = ObjectSerializable.toBean(xml, Person.class);

xStream序列化和反序列化方法
XStream xStream = new XStream();
String xmlXstream = xStream.toXML(joe);
Person p = (Person)xStream.fromXML(xmlXstream);

Bboss依赖的包:
bboss-aop.jar
cglib-2.2.jar
frameworkset-util.jar
log4j-1.2.14.jar
bboss-soa.jar

Xstream依赖的包:
xpp3-1.1.4c.jar
xstream-1.3.1.jar

接口基本上都非常简单。依赖的包也都非常少。

2.数据结构
测试的数据结构包含int,String,Date,Date[],Object嵌套结构,String数组,二维数组,List,Map,Set,二进制文件
3.数据规模
分为以下三种
小负荷规模-1000字节数据,
大负荷规模-47K的 xml数据
文件对象数据-文件大小47K,文件内容为xml串。
4.测试环境
所以的测试用例基于以下环境测试:
联想thinkpad sl400
OS 32位windows xp professional sp3
内存2G
cpu:
型号 Intel(R) Core(TM)2 Duo T5870
主频 2GHz

用例运行工具:myeclipse 8.0
jdk 1.5.0_06
Junit 4


5.测试用例1-小负荷测试
5.1测试数据
PhoneNumber phone = new PhoneNumber();
		phone.setCode(123);
		phone.setNumber("1234-456");

		PhoneNumber fax = new PhoneNumber();
		fax.setCode(123);
		fax.setNumber("<aaaa>9999-999</bbbb>");

	   Set dataSet = new TreeSet();
	   dataSet.add("aa");
	   dataSet.add("bb");
	   
	   List dataList = new ArrayList();
	   dataList.add("aa");
	   dataList.add("bb");
	   
	   Map dataMap = new HashMap();
	   dataMap.put("aa","aavalue");
	   dataMap.put("bb","bbvalue");
	   
	   String[] dataArray = new String[]{"aa","bb"};
	   
		
		Person joe = new Person();
		joe.setFirstname("Joe");
//		joe.setLastname("Walnes");
		//用来验证bboss和Xstream是否会按照null值传递,也就是说lastname有默认值"ssss"
		//这样我们手动把lastname设置为null,理论上来说反序列化后joe中的lastname应该是null而不是默认值"ssss"
		joe.setBirthdate(new Date());
		Date[] updates = new Date[]{new Date(),new Date()};
		joe.setUpdatedate(updates);
		joe.setLastname(null);
		joe.setPhone(phone);
		joe.setFax(fax);
		joe.setDataArray(dataArray);
		joe.setDataList(dataList);
		joe.setDataMap(dataMap);
		joe.setDataSet(dataSet);

5.2测试结果
5.2.1序列化
执行次数 Bboss耗时 XStream耗时 Bboss包大小 XStream包大小
1次       0毫秒 0毫秒             1002字节            753字节
10次       0毫秒 16毫秒
100次       31毫秒 78毫秒
1000次       78毫秒 218毫秒
10000次       469毫秒 1625毫秒


5.2.2反序列化
执行次数 Bboss耗时 XStream耗时 Bboss包大小 XStream包大小
1次       0毫秒 0豪秒            1002字节            753字节
10次       47毫秒 15毫秒
100次       282毫秒 63毫秒
1000次       1250毫秒 312毫秒
10000次       9328毫秒 2344毫秒
6.测试用例2-大负荷测试
6.1测试数据
测试的对象实例字段包含了47k的xml串,本用例针对这个对象实例分别采用bboss和xstream来进行序列化和反序列化测试,并给出测试结果。
//这个文件中内容有47565 字节,约47k的数据
		String bigcontent = FileUtil.getFileContent(new File("D:\\workspace\\bbossgroups-3.2\\bboss-soa\\test\\org\\frameworkset\\soa\\testxstream.xml"), "GBK");
		PhoneNumber phone = new PhoneNumber();
		phone.setCode(123);
		phone.setNumber("1234-456");

		PhoneNumber fax = new PhoneNumber();
		fax.setCode(123);
		fax.setNumber(bigcontent);
		
	   Set dataSet = new TreeSet();
	   dataSet.add("aa");
	   dataSet.add("bb");
	   
	   List dataList = new ArrayList();
	   dataList.add("aa");
	   dataList.add("bb");
	   
	   Map dataMap = new HashMap();
	   dataMap.put("aa","aavalue");
	   dataMap.put("bb","bbvalue");
	   
	   String[] dataArray = new String[]{"aa","bb"};
	   
		
		Person joe = new Person();
		joe.setFirstname("Joe");
//		joe.setLastname("Walnes");
		//用来验证bboss和Xstream是否会按照null值传递,也就是说lastname有默认值"ssss"
		//这样我们手动把lastname设置为null,理论上来说反序列化后joe中的lastname应该是null而不是默认值"ssss"
		
		joe.setLastname(null);
		joe.setPhone(phone);
		joe.setFax(fax);
		joe.setDataArray(dataArray);
		joe.setDataList(dataList);
		joe.setDataMap(dataMap);
		joe.setDataSet(dataSet);


6.2测试结果
6.2.1序列化
执行次数 Bboss耗时 XStream耗时 生成的Bboss包大小 生成XStream包大小
1次       32毫秒 31毫秒                       48K 78K
10次       31毫秒 94毫秒
100次       312毫秒 875毫秒
1000次       2922毫秒 8078毫秒
10000次       29141毫秒 81938毫秒


6.2.2反序列化
执行次数 Bboss耗时 XStream耗时 Bboss包大小 XStream包大小
1次       15毫秒 46毫秒            48K            78K
10次       125毫秒 235毫秒
100次       1391毫秒 2234毫秒
1000次       12547毫秒 22781毫秒
10000次       126047毫秒 230688毫秒

7.测试用例3-File对象测试
7.1测试数据
测试的对象实例字段包含File对象,文件大小为47K,本用例针对这个对象实例分别采用bboss和xstream来进行序列化和反序列化测试,并给出测试结果。
//这个文件中内容有47565 字节,约47k的数据
		File fileData = new File("D:\\workspace\\bbossgroups-3.2\\bboss-soa\\test\\org\\frameworkset\\soa\\testxstream.xml");
		PhoneNumber phone = new PhoneNumber();
		phone.setCode(123);
		phone.setNumber("1234-456");

		PhoneNumber fax = new PhoneNumber();
		fax.setCode(123);
		fax.setNumber("<aaaa>9999-999</bbbb>");
		
	   Set dataSet = new TreeSet();
	   dataSet.add("aa");
	   dataSet.add("bb");
	   
	   List dataList = new ArrayList();
	   dataList.add("aa");
	   dataList.add("bb");
	   
	   Map dataMap = new HashMap();
	   dataMap.put("aa","aavalue");
	   dataMap.put("bb","bbvalue");
	   
	   String[] dataArray = new String[]{"aa","bb"};
	   
		
		FilePerson joe = new FilePerson();
		joe.setFileData(fileData);
		joe.setFirstname("Joe");
//		joe.setLastname("Walnes");
		//用来验证bboss和Xstream是否会按照null值传递,也就是说lastname有默认值"ssss"
		//这样我们手动把lastname设置为null,理论上来说反序列化后joe中的lastname应该是null而不是默认值"ssss"
		
		joe.setLastname(null);
		joe.setPhone(phone);
		joe.setFax(fax);
		joe.setDataArray(dataArray);
		joe.setDataList(dataList);
		joe.setDataMap(dataMap);
		joe.setDataSet(dataSet);

7.2测试结果
7.2.1序列化
执行次数 Bboss耗时 XStream耗时 生成的Bboss包大小 生成XStream包大小
1次       31毫秒 无法对文件对象内容进行序列化 65K ---
10次       141毫秒 无法对文件对象内容进行序列化
100次       1609毫秒 无法对文件对象内容进行序列化
1000次       16531毫秒 无法对文件对象内容进行序列化
10000次       166641毫秒无法对文件对象内容进行序列化


7.2.2反序列化
执行次数 Bboss耗时 XStream耗时         Bboss包大小 XStream包大小
1次       94毫秒 无法对文件对象内容进行反序列化 65K ---
10次       297毫秒 无法对文件对象内容进行反序列化
100次       2313毫秒 无法对文件对象内容进行反序列化
1000次       22375毫秒 无法对文件对象内容进行反序列化
10000次       226968毫秒无法对文件对象内容进行反序列化


8.总结
序列化
小数量的情况下,bboss比xstream要快3到4倍,bboss产生的序列化数据包比xstream略大一点。
中等数据量或者大数据量情况下bboss比xstream要快3到4倍,bboss产生的序列化数据包为48K基本接近实际数据大小,比xstream产生的包要小一半(xstream为78K)


反序列化
小数据量情况下,xstream比bboss快3-4倍
中等数据(xml数据)量或者大数据量(xml数据)情况下,bboss比xstream要快2-3倍

数据类型的支持
Bboss和xstream都提供了以下数据类型的序列化/反序列化支持:
基础数据类型;
list,map,set,数组,多维数组,枚举类型;
复杂对象类型;
异常Exception;
Date和Date[]类型
以及所有上面类型的组合嵌套类型

另外,从测试的情况来看bboss支持对文件对象类型的序列化/反序列化,而xstream不支持。

综上所述,从整体性能、产生的序列化包大小以及对数据类型支持类别三个角度来看,bboss比XStream都出色很多,尤其是在处理比较大的xml串时xstream表现非常差,从技术选型的角度上来看bboss应该是首选。

最新代码已经提交到 github

也可到以下下载地址: bbossgroups-3.5

序列化测试用例: TestSerializable






目录
相关文章
|
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序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
|
28天前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
27 0
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
3月前
|
存储 开发框架 .NET
解锁SqlSugar新境界:利用Serialize.Linq实现Lambda表达式灵活序列化与反序列化,赋能动态数据查询新高度!
【8月更文挑战第3天】随着软件开发复杂度提升,数据查询的灵活性变得至关重要。SqlSugar作为一款轻量级、高性能的.NET ORM框架,简化了数据库操作。但在需要跨服务共享查询逻辑时,直接传递Lambda表达式不可行。这时,Serialize.Linq库大显身手,能将Linq表达式序列化为字符串,实现在不同服务间传输查询逻辑。结合使用SqlSugar和Serialize.Linq,不仅能够保持代码清晰,还能实现复杂的动态查询逻辑,极大地增强了应用程序的灵活性和可扩展性。
143 2
|
2月前
|
JSON fastjson Java
niubility!即使JavaBean没有默认无参构造器,fastjson也可以反序列化。- - - - 阿里Fastjson反序列化源码分析
本文详细分析了 Fastjson 反序列化对象的源码(版本 fastjson-1.2.60),揭示了即使 JavaBean 沲有默认无参构造器,Fastjson 仍能正常反序列化的技术内幕。文章通过案例展示了 Fastjson 在不同构造器情况下的行为,并深入探讨了 `ParserConfig#getDeserializer` 方法的核心逻辑。此外,还介绍了 ASM 字节码技术的应用及其在反序列化过程中的角色。
79 10
|
2月前
|
存储 XML JSON
用示例说明序列化和反序列化
用示例说明序列化和反序列化
|
2月前
|
存储 Java 开发者
Java编程中的对象序列化与反序列化
【9月更文挑战第20天】在本文中,我们将探索Java编程中的一个核心概念——对象序列化与反序列化。通过简单易懂的语言和直观的代码示例,你将学会如何将对象状态保存为字节流,以及如何从字节流恢复对象状态。这不仅有助于理解Java中的I/O机制,还能提升你的数据持久化能力。准备好让你的Java技能更上一层楼了吗?让我们开始吧!