#java #jackson #jaxb #jackson-dataformat-xml
#java #джексон #jaxb #jackson-dataformat-xml
Вопрос:
Мне нужно преобразовать большое количество данных в формат XML. Я изучаю JAXB, поскольку он является частью JDK 8, но я не уверен в том, как он работает с огромными данными. Jackson XML — это еще одна библиотека, с которой я сталкиваюсь, которая новее. Быстрее ли Jackson, чем JAXB, при сериализации объекта в 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[jackamp;<xml val=amp;apos;Jsonamp;apos;amp;>]]amp;>]]></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 использует 1/22 времени, затрачиваемого JAXB. При десериализации Jackson использует 1/30 времени, затрачиваемого JAXB.