走自己的路

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

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

XStreamthoughtworks开发的开源产品,采用的是xpp来进行xml和对象之间的转换。它不需要schema或其他的mapping文件就可以进行java对象和xml文件之间的转换,API调用起来非常方便,并且扩展功能强大。                

网址:http://xstream.codehaus.org


JSON是目前比较流行的轻量级的对象数据转换方式,常常用在ajaxweb service领域。目前大部分语言都有JSON的实现。Java领域有json lib,还有xstream json(jettison)

网址:http://json-lib.sourceforge.net/

http://jettison.codehaus.org


主要是对
3 (xstream, json lib, xstream json) 转换的数据长度,还有转换的效率做个比较。

转换的java类为:

package com.ldd600.ws;

public class Employee {
    
private String name;
    
private int age;
    
private Address address;
    
private double salary;
    
private boolean isActive;
    
private char sexy;

    
public String getName() {
        
return name;
    }


    
public void setName(String naem) {
        
this.name = naem;
    }


    
public int getAge() {
        
return age;
    }


    
public void setAge(int age) {
        
this.age = age;
    }


    
public Address getAddress() {
        
return address;
    }


    
public void setAddress(Address address) {
        
this.address = address;
    }


    
public double getSalary() {
        
return salary;
    }


    
public void setSalary(double salary) {
        
this.salary = salary;
    }


    
public boolean isActive() {
        
return isActive;
    }


    
public void setActive(boolean isActive) {
        
this.isActive = isActive;
    }


    
public char getSexy() {
        
return sexy;
    }


    
public void setSexy(char sexy) {
        
this.sexy = sexy;
    }


}


package com.ldd600.ws;

public class Address {
    
private String street;
    
private String country;
    
private String city;
    
private String doorNum;
//    private Employee employee;
    private String empName;
    
    
public String getStreet() {
        
return street;
    }


    
public void setStreet(String street) {
        
this.street = street;
    }


    
public String getCountry() {
        
return country;
    }


    
public void setCountry(String country) {
        
this.country = country;
    }


    
public String getCity() {
        
return city;
    }


    
public void setCity(String city) {
        
this.city = city;
    }


    
public String getDoorNum() {
        
return doorNum;
    }


    
public void setDoorNum(String doorNum) {
        
this.doorNum = doorNum;
    }


    
public String getEmpName() {
        
return empName;
    }


    
public void setEmpName(String empName) {
        
this.empName = empName;
    }

    
//    public Employee getEmployee() {
//        return employee;
//    }
//
//    public void setEmployee(Employee employee) {
//        this.employee = employee;
//    }
    
}

 

数据格式和长度比较:

方法

长度

格式

Xstream

328

<com.ldd600.ws.Employee>

  <name>gavin</name>

  <age>0</age>

  <address>

    <street>zhaojiabang</street>

    <country>china</country>

    <city>shanghai</city>

    <doorNum>789</doorNum>

    <empName>gavin</empName>

  </address>

  <salary>300000.0</salary>

  <isActive>true</isActive>

  <sexy>m</sexy>

</com.ldd600.ws.Employee>

Json lib

170

"789","empName":"gavin","street":"zhaojiabang"},"age":0,"name":"gavin","salary":300000,"sexy":"m"}

XStream json

183

{"employee":{"name":"gavin","age":0,"address":{"street":"zhaojiabang","country":"china","city":"shanghai","doorNum":789,"empName":"gavin"},"salary":300000,"isActive":true,"sexy":"m"}}

 

时间(转换次数1000000):

方式

时间(ms)

Json lib

185638

XStream xml

247863

XStream json

395624

 

Xstream xml方式比json lib慢:62s

Xstream json方式比xstream xml慢:147s

 

如何选择:

JSON:

只是纯粹数据转换的方式,如果不需要命名空间,验证,XSLTxml的功能,可以考虑使用。但是JSON规范还存在一些不支持的情况,比如当Address类中也有Employee类的引用时,转换就会抛出异常。要说明的是jettison应该是xmljson之间转换的工具,xstream利用jettison完成java对象到xml再到json的转换,这样性能就更糟糕了。而且xstream json有很多不满足json规范的地方,比如一个空stringjson规范中会转成null,而在xstream json中会转换成””, 所以在使用其他json工具消费xstream json生产的json字符串时就会出现问题。但Json lib提供了JSonConfig类解决了这个问题。如果进行xmljson之间的转换可以考虑使用jettison

 

XStream

采用xml作为数据转换的方式,这就是xmljson之争了。可以参考以下资源:

JSON vs. XML: The Debate

http://ajaxian.com/archives/json-vs-xml-the-debate

JSON Web Services - the XML JSON debate further ahead

http://techtracer.com/2007/04/01/json-web-services-the-xml-json-debate-further-ahead/

JSON Pros and Cons

http://myarch.com/json-pros-and-cons

Debate: JSON vs. XML as a data interchange format

http://www.infoq.com/news/2006/12/json-vs-xml-debate



Xstream不需要关心xml schema验证,它比json好的一个地方是它可以自动处理引用的表达方式,比如多个变量重复引用同一个对象,循环引用等,如;

<employee reference="../.."/>

它的API使用太方便了,

XStream xstream = new XStream();

String xml = xstream.toXML(employee);

Employee xsEmployee = (Employee) xstream.fromXML(xml);

Xstream自定义和扩展功能也很强大,如用户可以通过converter来实现自己类型的转换逻辑。

 

现在我们有个项目需要设计一个通用的web service agent,根据客户端提供的类名,方法名,参数等调用本地的方法。这样可能需要一种统一的数据格式和处理方式,考虑传的参数可能出现互相引用的情况,还有可读性,将来的扩展性等问题决定默认方式还是使用xstream来转换。



posted on 2009-01-20 17:43 叱咤红人 阅读(3913) 评论(5)  编辑  收藏 所属分类: JDBC JNDI JMS RMI EJB and Other J2EE Tech TestXML

评论

# re: 对比XStream和JSON 2009-01-21 10:24 sorcerer
乖乖,这么多人看,没人评论.我来支持一下.
thoughtworks如雷贯耳啊...
  回复  更多评论
  

# re: 对比XStream和JSON 2009-01-21 11:15 杨一
数据传输还是用json
但是xstream用来解析处理xml看起来不错,比jaxb简单  回复  更多评论
  

# re: 对比XStream和JSON 2009-01-21 15:33 sniperking
web service传递数据还是用XML比较好,通用性强  回复  更多评论
  

# re: 对比XStream和JSON 2009-01-21 16:06 yefeng
json_lib性能也不是很好的,还是自己写一个吧,也不难的,就反射而已  回复  更多评论
  

# re: 对比XStream和JSON 2009-01-21 16:43 ldd600
@yefeng
json lib应该还好,它用了bean utils应该有缓存那些反射的结果。如果用json org的那个估计性能就不行了。  回复  更多评论
  


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


网站导航: