这两东东本质上是有差别的,JAXB称为OX binding工具,XStream应该算序列化工具,但OX binding工具也会marshall和unmarshall,所以包含了序列化这一部分。序列化工具不一定需要提供binding的功能。既然都玩序列化,那就简单地比较一下它们两在序列化方面的强弱吧。
JAXB:Toplink JAXB 10133,应该是JAXB 1.1标准 (取消了schema的validation功能)
XStream:1.3.1
数据长度:
类型 | 长度 | 内容 |
XStraem | 351 | <com.oocl.frm.ws.sample.Employee> <name>Liufei</name> <age>40</age> <address> <street>Zhaojiabang</street> <country>China</country> <city>Shanghai</city> <doorNum>789</doorNum> <empName>Afka liu</empName> </address> <salary>20000.0</salary> <isActive>false</isActive> <sexy>F</sexy> </com.oocl.frm.ws.sample.Employee> |
Toplink JAXB | 589(已经去掉了white space) | <?xml version="1.0" encoding="UTF-8"?> <ns0:employee xsi:schemaLocation="http://www.oocl.com/frm/ws/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns0="http://www.oocl.com/frm/ws/jaxb" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><ns0:name>Liufei</ns0:name><ns0:age>40</ns0:age><ns0:salary>20000.0</ns0:salary><ns0:sexy>F</ns0:sexy><ns0:isActive>false</ns0:isActive><ns0:address><ns0:street>Zhaojiabang</ns0:street><ns0:country>China</ns0:country><ns0:city>Shanghai</ns0:city><ns0:doorNum>789</ns0:doorNum><ns0:empName>Afka liu</ns0:empName></ns0:address></ns0:employee> |
时间:序列化和反序列化1000000次。
类型 | 序列化(ms) | 反序列化(ms) |
XStraem | 90148 | 135878 |
Toplink JAXB | 34872 | 56557 |
结果对比:数据量XStream占优势,时间性能上Toplink Jaxb占明显优势
总结(只从序列化功能角度看)
JAXB: 优点
- J2EE标准
- 运行时间比XStream少
缺点
- 用起来不方便:需要把手动的把business object转换成schema object,当然也可以直接将schema object作为business object,或者采用反射的方法。
- 有一定的局限性:需要schema或者annotation
- 数据量稍大
XStream优点:
- 用起来方便
- 不需要schema,拿过来就转
- 数据量稍小
缺点:
- 非标准
- 时间性能差
|
|
评论
更小的数据量、更少的时间:
<com.oocl.frm.ws.sample.Employee name="LiuFei" age="40" salary="20000.0" isActive="false" sex="F" >
<address street="Zhaojiabang" country="china" city="Shanghai" doornum=789 empName="Afka liu" />
</com.oocl.frm.ws.sample.Employee> 回复 更多评论
可以用alias省掉一些信息,我们是用在远程通信上的,如果去掉了类的路径,就无法还原了。采用alias我想会带来复杂性的。这样是我们所需的最少信息量了。请问有什么好的办法可以不要某些white space,相当于jaxb的 this.marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
Boolean.FALSE);
回复 更多评论
我不太明白,在远程通信上,使用xml作为中间传输内容,就是为了做系统(甚至是异构系统)之间的解耦。
如果xml内容上,还捆绑了类信息,那么既要求两个系统为同语言系统,又将两个系统都捆绑到具体的一个model上。未必是一件好事。
回复 更多评论
呵呵,类似RPC吧:JAX-RPC, REST-RPC。序列化后还是要还原成Object的。 回复 更多评论
如果需要捆绑Object,类似RPC调用,那为什么不选择hessian等二进制序列化方式的组件。
毕竟二进制序列化/反序列化效率比xml转化高多了。
当然hessian不同版本在协议上的不兼容,是一件很头疼的事情 :( 回复 更多评论
是个很好的提议。但在可读性和公司policy方面还需要考虑。而且我们只是需要序列化的机制,并不是需要特殊的服务协议。我们可以通过HTTP,RMI, JMS,FTP或者其他各种方式完成同步,异步的服务调用。 回复 更多评论
首先,xstream是为了序列化成xml文档,并没要求服务端也需要xstream来解析文档啊,所以不存在异构系统读取该类的情况,异构系统完全可以把xml文档看做是一份数据来用。而且xstream是可以更改内容标签的名称的。
然后是2进制序列化的问题,其实不是说2进制序列化不好,而是因为很多应用环境只开发http协议,所以才有xml文档做webservice的接口。 回复 更多评论