XStream是thoughtworks開發的開源產品,采用的是xpp來進行xml和對象之間的轉換。 它不需要schema或其他的mapping文件就可以進行java對象和xml文件之間的轉換,API調 用起來非常方便,並且擴展功能強大。
網址:http://xstream.codehaus.org
JSON是目前比較流行的輕量級的對象數據轉換方式,常常用在ajax和web 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":& quot;zhaojiabang"},"age":0,"name":"gavin",& quot;salary":300000,"sexy":"m"}
XStream json
183
{"employee": {"name":"gavin","age":0,"address": {"street":"zhaojiabang","country":"china&qu ot;,"city":"shanghai","doorNum":789,"empNam e":"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:
只是純粹數據轉換的方式,如果不需要命名空間,驗證,XSLT等xml的功能,可以考慮 使用。但是JSON規范還存在一些不支持的情況,比如當Address類中也有Employee類的引 用時,轉換就會拋出異常。要說明的是jettison應該是xml和json之間轉換的工具, xstream利用jettison完成java對象到xml再到json的轉換,這樣性能就更糟糕了。而且 xstream json有很多不滿足json規范的地方,比如一個空string在json規范中會轉成null ,而在xstream json中會轉換成””, 所以在使用xstream json消費其他json 工具生產的json字符串時就會出現問題。但Json lib提供了JSonConfig類解決了這個問題 。如果進行xml和json之間的轉換可以考慮使用jettison。
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來轉換。