XStream是thoughtworks開發(fā)的開源產(chǎn)品,采用的是xpp來進(jìn)行xml和對(duì)象之間的轉(zhuǎn)換。它不需要schema或其他的mapping文件就可以進(jìn)行java對(duì)象和xml文件之間的轉(zhuǎn)換,API調(diào)用起來非常方便,并且擴(kuò)展功能強(qiáng)大。
網(wǎng)址:http://xstream.codehaus.org
JSON是目前比較流行的輕量級(jí)的對(duì)象數(shù)據(jù)轉(zhuǎn)換方式,常常用在ajax和web service領(lǐng)域。目前大部分語言都有JSON的實(shí)現(xiàn)。Java領(lǐng)域有json lib,還有xstream json(jettison)。
網(wǎng)址:http://json-lib.sourceforge.net/
http://jettison.codehaus.org
主要是對(duì)3者 (xstream, json lib, xstream json) 轉(zhuǎn)換的數(shù)據(jù)長(zhǎng)度,還有轉(zhuǎn)換的效率做個(gè)比較。
轉(zhuǎn)換的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;
// }
}
數(shù)據(jù)格式和長(zhǎng)度比較:
方法
|
長(zhǎng)度
|
格式
|
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"}}
|
時(shí)間(轉(zhuǎn)換次數(shù)1000000):
方式
|
時(shí)間(ms)
|
Json lib
|
185638
|
XStream xml
|
247863
|
XStream json
|
395624
|
Xstream xml方式比json lib慢:62s
Xstream json方式比xstream xml慢:147s
如何選擇:
JSON:
只是純粹數(shù)據(jù)轉(zhuǎn)換的方式,如果不需要命名空間,驗(yàn)證,XSLT等xml的功能,可以考慮使用。但是JSON規(guī)范還存在一些不支持的情況,比如當(dāng)Address類中也有Employee類的引用時(shí),轉(zhuǎn)換就會(huì)拋出異常。要說明的是jettison應(yīng)該是xml和json之間轉(zhuǎn)換的工具,xstream利用jettison完成java對(duì)象到xml再到json的轉(zhuǎn)換,這樣性能就更糟糕了。而且xstream json有很多不滿足json規(guī)范的地方,比如一個(gè)空string在json規(guī)范中會(huì)轉(zhuǎn)成null,而在xstream json中會(huì)轉(zhuǎn)換成””, 所以在使用其他json工具消費(fèi)xstream json生產(chǎn)的json字符串時(shí)就會(huì)出現(xiàn)問題。但Json lib提供了JSonConfig類解決了這個(gè)問題。如果進(jìn)行xml和json之間的轉(zhuǎn)換可以考慮使用jettison。
XStream:
采用xml作為數(shù)據(jù)轉(zhuǎn)換的方式,這就是xml和json之爭(zhēng)了。可以參考以下資源:
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不需要關(guān)心xml schema驗(yàn)證,它比json好的一個(gè)地方是它可以自動(dòng)處理引用的表達(dá)方式,比如多個(gè)變量重復(fù)引用同一個(gè)對(duì)象,循環(huán)引用等,如;
<employee reference="../.."/>。
它的API使用太方便了,
XStream xstream = new XStream();
String xml = xstream.toXML(employee);
Employee xsEmployee = (Employee) xstream.fromXML(xml);
Xstream自定義和擴(kuò)展功能也很強(qiáng)大,如用戶可以通過converter來實(shí)現(xiàn)自己類型的轉(zhuǎn)換邏輯。
現(xiàn)在我們有個(gè)項(xiàng)目需要設(shè)計(jì)一個(gè)通用的web service agent,根據(jù)客戶端提供的類名,方法名,參數(shù)等調(diào)用本地的方法。這樣可能需要一種統(tǒng)一的數(shù)據(jù)格式和處理方式,考慮傳的參數(shù)可能出現(xiàn)互相引用的情況,還有可讀性,將來的擴(kuò)展性等問題決定默認(rèn)方式還是使用xstream來轉(zhuǎn)換。