使用 XStream 不用任何映射就能实现多数 Java 对象的序列化。在生成的 XML 中对象名变成了元素名,类中的字符串组成了 XML 中的元素内容。使用 XStream 序列化的类不需要实现 Serializable 接口。XStream 是一种序列化工具而不是数据绑定工具,就是说不能从 XML 或者 XML Schema Definition (XSD) 文件生成类。
和其他序列化工具相比,XStream 有三个突出的特点:
- XStream 不关心序列化/逆序列化的类的字段的可见性。
- 序列化/逆序列化类的字段不需要 getter 和 setter 方法。
- 序列化/逆序列化的类不需要有默认构造函数。
不需要修改类,使用 XStream 就能直接序列化/逆序列化任何第三方类。
下面介绍一下XStream(http://xstream.codehaus.org )把POJO<<-->>XML/JSON的相互转化。
上代码例子
import java.util.ArrayList;
import java.util.List;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamDriver;
import com.thoughtworks.xstream.io.xml.DomDriver;
public class Test {
public static class Customer {
private int custId;
private String custName;
private List<Order> orders;
public int getCustId() {
return custId;
}
public void setCustId(int custId) {
this.custId = custId;
}
public String getCustName() {
return custName;
}
public void setCustName(String custName) {
this.custName = custName;
}
public List<Order> getOrders() {
return orders;
}
public void setOrders(List<Order> orders) {
this.orders = orders;
}
}
public static class Order {
private int orderId;
private String orderName;
private Product[] products;
public int getOrderId() {
return orderId;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
public Product[] getProducts() {
return products;
}
public void setProducts(Product[] products) {
this.products = products;
}
}
public static class Product {
private int prodId;
private String prodName;
private double prodPrice;
public int getProdId() {
return prodId;
}
public void setProdId(int prodId) {
this.prodId = prodId;
}
public String getProdName() {
return prodName;
}
public void setProdName(String prodName) {
this.prodName = prodName;
}
public double getProdPrice() {
return prodPrice;
}
public void setProdPrice(double prodPrice) {
this.prodPrice = prodPrice;
}
}
public static void main(String[] args) {
Product p1 = new Product();
p1.setProdId(20100001);
p1.setProdName("苹果");
p1.setProdPrice(8888);
Product p2 = new Product();
p2.setProdId(20100002);
p2.setProdName("联想");
p2.setProdPrice(6000);
Product[] prods1 = new Product[] { p1, p2 };
Order order1 = new Order();
order1.setOrderId(101);
order1.setOrderName("笔记本");
order1.setProducts(prods1);
List<Order> orders = new ArrayList<Order>();
orders.add(order1);
Customer customer = new Customer();
customer.setCustId(100001);
customer.setCustName("张三");
customer.setOrders(orders);
XStream xstream = new XStream(new DomDriver());
xstream.alias("customer", Customer.class);
xstream.alias("order", Order.class);
xstream.alias("product", Product.class);
String xml = xstream.toXML(customer);// 转换成 xml 格式
System.out.println(xml); // 输出 xml 字符串
System.out.println("---------------------JSON-----------------------------");
// JSON
XStream xstream4JSON = new XStream(new JsonHierarchicalStreamDriver());
String json = xstream4JSON.toXML(customer);// 转换成 JSON 格式
System.out.println(json); // 输出 JSON 字符串
}
}
打印结果
<customer> <custId>100001</custId> <custName>张三</custName> <orders> <order> <orderId>101</orderId> <orderName>笔记本</orderName> <products> <product> <prodId>20100001</prodId> <prodName>苹果</prodName> <prodPrice>8888.0</prodPrice> </product> <product> <prodId>20100002</prodId> <prodName>联想</prodName> <prodPrice>6000.0</prodPrice> </product> </products> </order> </orders> </customer> ---------------------JSON----------------------------- {"Zbingo.grid.lookup.Test$Customer": { "custId": 100001, "custName": "张三", "orders": [ { "orderId": 101, "orderName": "笔记本", "products": [ { "prodId": 20100001, "prodName": "苹果", "prodPrice": 8888.0 }, { "prodId": 20100002, "prodName": "联想", "prodPrice": 6000.0 } ] } ] }}