走自己的路

路漫漫其修远兮,吾将上下而求索

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  50 随笔 :: 4 文章 :: 118 评论 :: 0 Trackbacks
  JAXB vs XStream

这两东东本质上是有差别的,JAXB称为OX binding工具,XStream应该算序列化工具,但OX binding工具也会marshallunmarshall,所以包含了序列化这一部分。序列化工具不一定需要提供binding的功能。既然都玩序列化,那就简单地比较一下它们两在序列化方面的强弱吧。

JAXBToplink JAXB 10133,应该是JAXB 1.1标准 (取消了schema的validation功能)

XStream1.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,拿过来就转
  • 数据量稍小

缺点:

  • 非标准
  • 时间性能差

 




评论

# re: JAXB vs XStream 2009-03-05 12:04 jasin
应用场景不一样,如果格式固定,就用jaxb,反之,xstream。  回复  更多评论
  

# re: JAXB vs XStream 2009-03-06 06:46 ldd600
是这么个理,如果对时间性能要求比较高的,jaxb的优先级要高于xstream;如果schema不能确定,要选一种序列化工具,xstream就是这种工具。  回复  更多评论
  

# re: JAXB vs XStream 2009-03-06 10:32 diggywang
你这个xstream用法可以再优化!
更小的数据量、更少的时间:
<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>  回复  更多评论
  

# re: JAXB vs XStream 2009-03-06 13:57 叱咤红人
@diggywang
可以用alias省掉一些信息,我们是用在远程通信上的,如果去掉了类的路径,就无法还原了。采用alias我想会带来复杂性的。这样是我们所需的最少信息量了。请问有什么好的办法可以不要某些white space,相当于jaxb的 this.marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
Boolean.FALSE);

  回复  更多评论
  

# re: JAXB vs XStream 2009-03-07 10:42 stone2083
@叱咤红人
我不太明白,在远程通信上,使用xml作为中间传输内容,就是为了做系统(甚至是异构系统)之间的解耦。
如果xml内容上,还捆绑了类信息,那么既要求两个系统为同语言系统,又将两个系统都捆绑到具体的一个model上。未必是一件好事。
  回复  更多评论
  

# re: JAXB vs XStream 2009-03-07 20:07 ldd600
@stone2083
呵呵,类似RPC吧:JAX-RPC, REST-RPC。序列化后还是要还原成Object的。  回复  更多评论
  

# re: JAXB vs XStream 2009-03-16 19:25 stone2083
我还有一个问题不明白:
如果需要捆绑Object,类似RPC调用,那为什么不选择hessian等二进制序列化方式的组件。
毕竟二进制序列化/反序列化效率比xml转化高多了。

当然hessian不同版本在协议上的不兼容,是一件很头疼的事情 :(  回复  更多评论
  

# re: JAXB vs XStream 2009-03-17 21:14 叱咤红人
@stone2083
是个很好的提议。但在可读性和公司policy方面还需要考虑。而且我们只是需要序列化的机制,并不是需要特殊的服务协议。我们可以通过HTTP,RMI, JMS,FTP或者其他各种方式完成同步,异步的服务调用。  回复  更多评论
  

# re: JAXB vs XStream[未登录] 2009-09-15 12:03 Jeffrey
@stone2083
首先,xstream是为了序列化成xml文档,并没要求服务端也需要xstream来解析文档啊,所以不存在异构系统读取该类的情况,异构系统完全可以把xml文档看做是一份数据来用。而且xstream是可以更改内容标签的名称的。
然后是2进制序列化的问题,其实不是说2进制序列化不好,而是因为很多应用环境只开发http协议,所以才有xml文档做webservice的接口。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: