【问题标题】:How's the performance of Jackson compared to JAXB in creating XML?与 JAXB 在创建 XML 方面相比,Jackson 的性能如何?
【发布时间】:2021-01-20 07:56:28
【问题描述】:

我必须将大量数据编组为 XML 格式。我正在研究 JAXB,因为它是 JDK 8 的一部分,但我不确定它如何处理大量数据。 Jackson XML 是我遇到的另一个较新的库。 Jackson 在将对象序列化为 XML 方面比 JAXB 快吗?

【问题讨论】:

    标签: java jackson jaxb jackson-dataformat-xml


    【解决方案1】:

    我曾经写过一个用例来测试 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&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 时间。

    【讨论】:

      猜你喜欢
      • 2017-01-11
      • 2015-06-22
      • 1970-01-01
      • 2020-12-09
      • 2011-03-22
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多