java - 与 JAXB 在创建 XML 方面相比,Jackson 的性能如何?
问题描述
我必须将大量数据编组为 XML 格式。我正在研究 JAXB,因为它是 JDK 8 的一部分,但我不确定它如何处理大量数据。Jackson XML 是我遇到的另一个较新的库。Jackson 在将对象序列化为 XML 方面比 JAXB 快吗?
解决方案
我曾经写过一个用例来测试 jackson 和 jaxb 在将对象序列化和反序列化到/从 xml 中的性能。测试代码:
序列化:
/** counter */
private int counter = 10000;
@Test
public void doTest() throws JAXBException{
TextMsg msg = new TextMsg();
msg.setToUserName("jackson");
msg.setFromUserName("hawaii");
msg.setContent("jack<xml val='Json'>]]>");
long start = System.currentTimeMillis();
for(int i=0; i< counter; i++){
ByteArrayOutputStream xmlOut = null;
ByteArrayInputStream xmlIn = null;
try{
xmlOut = new ByteArrayOutputStream();
XMLFactory.toXML(msg, xmlOut);
String xml = new String(xmlOut.toByteArray());
}finally{
IOUtils.closeQuietly(xmlIn);
IOUtils.closeQuietly(xmlOut);
}
}
long end = System.currentTimeMillis();
logger.info("consume:{}", end - start);
}
反序列化
/** counter */
private int counter = 10000;
@Test
public void doTest() throws IOException, JAXBException{
String xml = "<?xml version='1.0' encoding='UTF-8'?><xml><ToUserName><![CDATA[jackson]]></ToUserName><FromUserName><![CDATA[hawaii]]></FromUserName><Content><![CDATA[jack<xml val='Json'>]]>]]></Content></xml>";
long start = System.currentTimeMillis();
for(int i=0; i< counter; i++){
ByteArrayOutputStream xmlOut = null;
ByteArrayInputStream xmlIn = null;
try{
xmlOut = new ByteArrayOutputStream();
TextMsg textMsg = XMLFactory.fromXML(xml, TextMsg.class);
}finally{
IOUtils.closeQuietly(xmlIn);
IOUtils.closeQuietly(xmlOut);
}
}
long end = System.currentTimeMillis();
logger.info("consume:{}", end - start);
}
结果(单位:毫秒,3次测试的平均值):
type: entity -> xml
JAXB:24716
Jackson:1123
JAXB:Jackson 22:1
type: xml -> entity
JAXB: 31622
Jackson: 1049
JAXB:Jackson 30:1
结论:同样的任务,在序列化中,Jackson 使用了 JAXB 的 1/22 时间消耗。在反序列化中,Jackson 使用了 JAXB 的 1/30 时间消耗。
推荐阅读
- java - SharedPreference 上的 ArrayIndexOutOfBoundsException 与布尔数组?
- javascript - 在 angularjs 中路由时,引导模式背景不会被删除
- python - 如何在 python 中运行命令,提供输入,然后读取输出
- reactjs - 未捕获的类型错误:无法读取未定义的属性“组件”
- mysql - 如何解决 SSMA 中的 M2SS0020(超出索引键)
- excel - 在excel中查找最早日期
- android - 没有找到与给定名称匹配的资源:attr 'android:keyboardNavigationCluster'
- html - display:inline-grid 不支持非常新鲜的 safari
- android - (Android)Firebase 数据库中是否有一种简单的方法可以让节点的位置按孩子排名?
- vba - 基于 Excel 循环条件的连接