与 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&lt;xml val=&apos;Json&apos;&gt;]]&gt;]]></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 时间消耗。