xml与java对象转化库JAXB与XStream的对比

简介

JAXB与XStream都能实现

  • 把java对象转化成xml文件
  • 把xml文件转化成java 对象

在实际工作,处理 xml 是个比较常见的工作。
选择一个使合适的库,可能会事倍工半。

共同点

  • 使用都比较方便,用几代码就可以进行转化成java对象
  • 都支持注解,支持节点指定名称

不同点

  • jaxb不支持泛型,xsteam支持
  • xstream格式化的xml不带字符集,通过外部的流来写字符集的。jaxb可以通过Marshaller.JAXB_ENCODING参数指定
  • jaxb 的注解有些不直观,而且要必选比如不加@XmlAccessorType(XmlAccessType.FIELD)的话,@XmlElement(name="xxx")就得写到方法上才不报错。xstream的注解用起来还没发发现有什么问题。

使用示例

jaxb

1
2
3
4
5
6
7
8
9
public static void exampleJAXB() throws JAXBException
{
JAXBContext jaxbContext = JAXBContext.newInstance(Student.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
Student t = getStudentDetails();
jaxbMarshaller.marshal(t, System.out);
}

xstream

1
2
3
4
5
6
7
public static void exampleXStream()
{
Student student = getStudentDetails();
XStream xstream = new XStream(new StaxDriver());
String xmlstr = xstream.toXML(student);
System.out.println(xmlstr);
}

总结

也是初步接触,性能上的差别,还没有测试。测试过再补上。
从使用感觉受上来说xstream在处理非确定格式上有一定优势,相对好用点。

maven

xstream

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/xstream/xstream -->
<dependency>
<groupId>xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.2.2</version>
</dependency>

jaxb

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl -->
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>

参考

https://www.mkyong.com/java/jaxb-hello-world-example/
https://www.tutorialspoint.com/xstream/xstream_quick_guide.htm
http://x-stream.github.io
http://www.blogjava.net/ldd600/archive/2009/03/04/257832.html