XStream 概述
XStream 是一套简洁易用的开发类库,用于将Java对象序列化为XML或者将XML反序列化为JAVA对象,是JAVA对象和XML之间一个双向转换器。
举例
User.java
package com.baobaotao.domain; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; public class User implements Serializable { private int userId; private String userName; private String password; private int credits; private String lastIp; private Date lastVisit; private List logs; private Map datas; public List<LoginLog> getLogs() { return logs; } public void setLogs(List logs) { this.logs = logs; } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getCredits() { return credits; } public void setCredits(int credits) { this.credits = credits; } public String getLastIp() { return lastIp; } public void setLastIp(String lastIp) { this.lastIp = lastIp; } public Date getLastVisit() { return lastVisit; } public void setLastVisit(Date lastVisit) { this.lastVisit = lastVisit; } public void addLoginLog(LoginLog log){ if(this.logs==null){ logs = new ArrayList<LoginLog>(); } logs.add(log); } public Map getDatas() { return datas; } public void setDatas(Map datas) { this.datas = datas; } }
LoginLog.java
package com.baobaotao.domain; import java.io.Serializable; import java.util.Date; public class LoginLog implements Serializable { private int loginLogId; private int userId; private String ip; private Date loginDate; public int getLoginLogId() { return loginLogId; } public void setLoginLogId(int loginLogId) { this.loginLogId = loginLogId; } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public Date getLoginDate() { return loginDate; } public void setLoginDate(Date loginDate) { this.loginDate = loginDate; } }
下面就开始使用XStream进行对象与 XML之间的转换.
package com.baobaotao.oxm.xtream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Date; import com.baobaotao.domain.LoginLog; import com.baobaotao.domain.User; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; public class XStreamSample { private static XStream xstream; static{ //创建XStream实例并指定一个XML 解析器 xstream=new XStream(new DomDriver()); } //初始化转换对象 public static User getUser(){ LoginLog log1=new LoginLog(); log1.setIp("192.168.1.91"); log1.setLoginDate(new Date()); User user=new User(); user.setUserId(1); user.setUserName("xstream"); user.addLoginLog(log1); return user; } //Java 对象转换成XML public static void objectToXML() throws Exception{ //获取转换User对象的实例 User user=getUser(); //实例化一个文件输出流 FileOutputStream fileOutputStream=new FileOutputStream("XStreamSample.xml"); //将User对象转换为XML,并保存到指定文件 xstream.toXML(user,fileOutputStream); } //XML转换为Java对象 public static User XMLToObject() throws Exception{ //实例化一个文件输入流 FileInputStream inputStream=new FileInputStream("XStreamSample.xml"); //将XML文件输入流转化为对象 User user=(User) xstream.fromXML(inputStream); for(LoginLog log :user.getLogs()){ if(log!=null){ System.out.println("访问IP:"+log.getIp()); } } } }
编写测试类
package com.baobaotao.oxm.xstream; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.io.BufferedReader; import java.io.FileReader; import org.junit.Test; import com.baobaotao.domain.LoginLog; import com.baobaotao.domain.User; import com.baobaotao.oxm.xtream.XStreamSample; public class TestXStreamSample { @Test public void objectToXml()throws Exception { XStreamSample.objectToXML(); FileReader reader = new FileReader("XStreamSample.xml"); BufferedReader br = new BufferedReader(reader); StringBuffer sb = new StringBuffer(""); String s; while ((s = br.readLine()) != null) { sb.append(s); } System.out.println(sb.toString()); reader.close(); br.close(); // assertXpathExists("//com.baobaotao.domain.User",sb.toString()); // assertXpathExists("//credits",sb.toString()); // assertXpathExists("//userName",sb.toString()); // assertXpathExists("//com.baobaotao.domain.LoginLog",sb.toString()); } @Test public void xmlToObject()throws Exception { XStreamSample.objectToXML(); User u = XStreamSample.XMLToObject(); assertNotNull(u); assertEquals("xstream",u.getUserName()); for (LoginLog log : u.getLogs()) { assertNotNull(log); assertNotNull(log.getIp()); assertNotNull(log.getLoginDate()); } } }
生成的XML文件如下:
<com.baobaotao.domain.User> <userId>1</userId> <userName>xstream</userName> <credits>0</credits> <logs> <com.baobaotao.domain.LoginLog> <loginLogId>0</loginLogId> <userId>0</userId> <ip>192.168.1.91</ip> <loginDate>2015-03-25 07:44:05.783 UTC</loginDate> </com.baobaotao.domain.LoginLog> </logs> </com.baobaotao.domain.User>
使用XStream 别名
在默认情况下,Java对象映射到XML的映射,是Java对象属性名对应XML的元素名,Java类的全名对应XML根元素的名字。在实际的应用中,如果XML和Java类都已经存在相应的名字,在进行转换时,需要设置别名进行映射。
XStream别名配置包含三种情况:
类别名,用alias(String name,Class type);
类成员别名,用aliasField(String alias,Class definedIn,String fieldName);yo
类成员作为属性别名,用aliasAttribute(Class definedIn,String attributeName,String alias),单独命名没有意义,还要通过useAttributeFor(Class definedIn,String fieldName) 应用到某个类上。
package com.baobaotao.oxm.xtream.alias; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Date; import com.baobaotao.domain.LoginLog; import com.baobaotao.domain.User; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; /** * 别名 * @author yulei */ public class XStreamAliasSample { private static XStream xstream; static { xstream=new XStream(new DomDriver()); //设置类别名,默认为当前类名称加上包名 xstream.alias("loginLog",LoginLog.class); xstream.alias("user",User.class); //设置类成员别名 xstream.aliasField("id",User.class,"userId"); //把LoginLog的userId属性视为XML属性,默认为XML的元素 xstream.aliasAttribute(LoginLog.class,"userId","id"); xstream.useAttributeFor(LoginLog.class,"userId"); //去掉集合类型生成XML的父节点,即忽略XML中的<logs></logs>标记 xstream.addImplicitCollection(User.class,"logs"); } //初始化转换对象 public static User getUser(){ LoginLog log1=new LoginLog(); log1.setIp("192.168.1.91"); log1.setLoginDate(new Date()); User user=new User(); user.setUserId(1); user.setUserName("xstream"); user.addLoginLog(log1); return user; } //Java 对象转换成XML public static void objectToXML() throws Exception{ //获取转换User对象的实例 User user=getUser(); //实例化一个文件输出流 FileOutputStream fileOutputStream=new FileOutputStream("XStreamSample.xml"); //将User对象转换为XML,并保存到指定文件 xstream.toXML(user,fileOutputStream); } //XML转换为Java对象 public static User XMLToObject() throws Exception{ //实例化一个文件输入流 FileInputStream inputStream=new FileInputStream("XStreamSample.xml"); //将XML文件输入流转化为对象 User user=(User) xstream.fromXML(inputStream); for(LoginLog log :user.getLogs()){ if(log!=null){ System.out.println("访问IP:"+log.getIp()); } } return user; } }