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;
- }
- }