如果性能是决定因素,那么什么是Java的最佳XML序列化库?
应用重点
>基于休息的API.
> Tomcat Servlet容器
>需要Java对象才能进行XML序列化
>不需要反序列化或重绑定库.
>需要开源库.
目前的表现数字
>使用StringBuffer附加“<”,“>”生成的XML等等.
>平均响应时间= 15毫秒.
>容易出现格式错误的XML和xml编码错误.
>使用XStream序列化生成的XML.
>平均响应时间= 200毫秒.
>易于维护和注释.
我遇到的其他库,例如JiBx,JaxB,Castor或Simple,似乎是绑定框架,并且似乎负担很重.
还有其他用于XML序列化的高性能替代方法,还是我应该继续使用Woodstox Stax实现(使用报告似乎是稳定的开源库中最快的报告)使用XMLStreamWriter API来实现toXml()?
解决方法:
我非常怀疑XStream是否需要200毫秒,除非您要发送非常大的对象.您确定您的VM已预热吗?
我不会将StringBuffer用作其线程安全的每次调用都带有锁的方法.请改用StringBuilder.
以下测试打印
Took 56 us on average to serialise a Person
您进行序列化的时间要长4000倍.您的测试未预热,或者您正在发送大量数据.如果是后者,我建议以二进制格式发送数据.
// based on the example in the two-minute tutorial.
public class XStreamTest {
public static class Person {
private String firstname;
private String lastname;
private PhoneNumber phone;
private PhoneNumber fax;
public Person(String firstname, String lastname, PhoneNumber phone, PhoneNumber fax) {
this.firstname = firstname;
this.lastname = lastname;
this.phone = phone;
this.fax = fax;
}
}
public static class PhoneNumber {
private int code;
private String number;
public PhoneNumber(int code, String number) {
this.code = code;
this.number = number;
}
}
public static void main(String... args) {
XStream xstream = new XStream();
xstream.alias("person", Person.class);
xstream.alias("phonenumber", PhoneNumber.class);
Person joe = new Person("Joe", "Walnes", new PhoneNumber(123, "1234-456"), new PhoneNumber(123, "9999-999"));
final int warmup = 10000;
final int runs = 20000;
long start = 0;
for (int i = -warmup; i < runs; i++) {
if(i == 0) start = System.nanoTime();
String xml = xstream.toXML(joe);
}
long time = System.nanoTime() - start;
System.out.printf("Took %,d us on average to serialise a Person%n", time / runs / 1000);
}
}