与 JAXB 相比,Jackson 在创建 XML 方面的表现如何?
How's the performance of Jackson compared to JAXB in creating XML?
我必须将大量数据整理成 XML 格式。我正在研究 JAXB,因为它是 JDK 8 的一部分,但我不确定它如何处理大量数据。 Jackson XML 是我遇到的另一个图书馆,它比较新。 Jackson 在将对象序列化为 XML 时比 JAXB 快吗?
我曾经写过一个用例来测试 jackson 和 jaxb 在序列化和反序列化对象时的性能 to/from 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 时间消耗。
我必须将大量数据整理成 XML 格式。我正在研究 JAXB,因为它是 JDK 8 的一部分,但我不确定它如何处理大量数据。 Jackson XML 是我遇到的另一个图书馆,它比较新。 Jackson 在将对象序列化为 XML 时比 JAXB 快吗?
我曾经写过一个用例来测试 jackson 和 jaxb 在序列化和反序列化对象时的性能 to/from 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 时间消耗。