@XStreamAlias使用
一、 特点:
简化的API;
无映射文件;
高性能,低内存占用;
整洁的XML;
不需要修改对象;支持内部私有字段,不需要setter/getter方法
提供序列化接口;
自定义转换类型策略;
二、 使用场景
Transport转换
Persistence 持久化对象
Configuration 配置
Unit Tests 单元测试
Interface服务之间XML消息的交互
三、 代码样例
请求类:
package xstream;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import com.thoughtworks.xstream.annotations.XStreamAlias;
@XStreamAlias("Response")
public class RequestTest {
@XStreamAlias("returncode")
private String returnCode;
@XStreamAlias("returnmessage")
private String returnMessage;
@XStreamAlias("status")
private int status;
@XStreamAlias("time")
private String reqTime;
public String getReturnCode() {
return returnCode;
}
public void setReturnCode(String returnCode) {
this.returnCode = returnCode;
}
public String getReturnMessage() {
return returnMessage;
}
public void setReturnMessage(String returnMessage) {
this.returnMessage = returnMessage;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getReqTime() {
return reqTime;
}
public void setReqTime(String reqTime) {
this.reqTime = reqTime;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this,ToStringStyle.MULTI_LINE_STYLE);
}
}
响应类
package xstream;
import java.sql.Timestamp;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import com.thoughtworks.xstream.annotations.XStreamAlias;
@XStreamAlias("Response")
public class ResponseTest {
@XStreamAlias("returncode")
private int resultCode;
@XStreamAlias("time")
private Timestamp time;
@XStreamAlias("returnmessage")
private String resultMessage;
@XStreamAlias("status")
private int state;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this,ToStringStyle.MULTI_LINE_STYLE);
}
}
Xstream工具类
package xstream;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
public class XstreamUtil {
/**
* 将bean转换为xml
* @param obj 转换的bean
* @return bean转换为xml
*/
public static String objectToXml(Object obj) {
XStream xStream = new XStream();
//xstream使用注解转换
xStream.processAnnotations(obj.getClass());
return xStream.toXML(obj);
}
/**
* 将xml转换为bean
* @param <T> 泛型
* @param xml 要转换为bean的xml
* @param cls bean对应的Class
* @return xml转换为bean
*/
public static <T> T xmlToObject(String xml,Class<T> cls){
XStream xstream = new XStream(new DomDriver());
//xstream使用注解转换
xstream.processAnnotations(cls);
return (T) xstream.fromXML(xml);
}
}
测试类
package xstream;
public class XStreamTest {
public static void main(String[] args) {
RequestTest requestTest = new RequestTest();
requestTest.setReturnCode("200");
requestTest.setReturnMessage("ok");
requestTest.setStatus(200);
requestTest.setReqTime("2013-09-22 00:00:00");
System.out.println(requestTest);
String request = XstreamUtil.objectToXml(requestTest);
System.out.println(request);
ResponseTest responseTest =XstreamUtil.xmlToObject(request,ResponseTest.class);
System.out.println(responseTest);
}
}
输出:
xstream.RequestTest@1fb8ee3[
returnCode=200
returnMessage=ok
status=200
reqTime=2013-09-22 00:00:00
]
<Response>
<returncode>200</returncode>
<returnmessage>ok</returnmessage>
<status>200</status>
<time>2013-09-22 00:00:00</time>
</Response>
xstream.ResponseTest@19dfbff[
resultCode=200
time=2013-09-22 00:00:00.0
resultMessage=ok
state=200
]
四、 总结
1. @XStreamAlias("message") 别名注解。
2. 使用注解序列化、反序列化,只要别名一样、字段不需要是同一类型(通过JAVA的API可以转换),不需要是同一个类,这为接口之间的交互提供了极大的方便。
3. 简化了API,不需要单独写解析xml的API。
4.toString方法使用ToStringBuilder.reflectionToString(this,ToStringStyle.MULTI_LINE_STYLE)。