XStream 概述

     XStream 是一套简洁易用的开发类库,用于将Java对象序列化为XML或者将XML反序列化为JAVA对象,是JAVA对象和XML之间一个双向转换器。

举例

    采用User用户对象和LoginLog登录日志对象作为XStream实例转换对象. 例子简单,直接贴代码了.
       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;
} }





XML 处理利器 : XStream的更多相关文章

  1. android XMl 解析神奇xstream 六: 把集合list 转化为 XML文档

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  2. android XMl 解析神奇xstream 五: 把复杂对象转换成 xml ,并写入SD卡中的xml文件

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  3. android XMl 解析神奇xstream 四: 将复杂的xml文件解析为对象

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  4. android XMl 解析神奇xstream 三: 把复杂对象转换成 xml

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  5. android XMl 解析神奇xstream 二: 把对象转换成xml

    前言:对xstream不理解的请看:android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 1.Javabeen 代码 packa ...

  6. android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件

    简介 XStream 是一个开源项目,一套简单实用的类库,用于序列化对象与 XML 对象之间的相互转换. 将 XML 文件内容解析为一个对象或将一个对象序列化为 XML 文件. 1.下载工具 xstr ...

  7. JAVA Bean和XML之间的相互转换 - XStream简单入门

    JAVA Bean和XML之间的相互转换 - XStream简单入门 背景介绍 XStream的简介 注解简介 应用实例 背景介绍 我们在工作中经常 遇到文件解析为数据或者数据转化为xml文件的情况, ...

  8. 微信开发,对象转换为xml时候引用XStream这个类报错处理方案

    报错的信息为:The type org.xmlpull.v1.XmlPullParser cannot be resolved. /**  * 扩展XStream 支持CDATA  */ privat ...

  9. JAVA bean与XML互转的利器---XStream

    最近在项目中遇到了JAVA bean 和XML互转的需求, 本来准备循规蹈矩使用dom4j忽然想起来之前曾接触过的XStream, 一番研究豁然开朗,利器啊利器, 下来就XStream的一些用法与大家 ...

随机推荐

  1. Android开发过程中在sh,py,mk文件中添加log信息的方法

    Android开发过程中在sh,py,mk文件中添加log信息的方法 在sh文件中: echo "this is a log info" + $info 在py文件中: print ...

  2. 在做自动化测试之前你需要知道的,转自:http://www.cnblogs.com/fnng/p/3653793.html

    什么是自动化测? 做测试好几年了,真正学习和实践自动化测试一年,自我感觉这一个年中收获许多.一直想动笔写一篇文章分享自动化测试实践中的一些经验.终于决定花点时间来做这件事儿. 首先理清自动化测试的概念 ...

  3. Redis工作系列之一 与 Memcached对比理解

         近期公司项目在使用Redis,这几年Redis很火,Redis也常常被当作Memcached的挑战者被提到桌面上来.关于Redis与Memcached的比较更是比比皆是.然而,Redis真的 ...

  4. SQLite Update 语句(http://www.w3cschool.cc/sqlite/sqlite-update.html)

    SQLite Update 语句 SQLite 的 UPDATE 查询用于修改表中已有的记录.可以使用带有 WHERE 子句的 UPDATE 查询来更新选定行,否则所有的行都会被更新. 语法 带有 W ...

  5. EXCEL技能之数据去重

    本篇不属于技术类博文,只是想找个地方记录而已,既然是我的博客嘛,那就自己想写什么就写什么了. CRM中有个EXCEL数据导入功能,几千条数据导入CRM后去重,那是死的心都有的.往回想想EXCEL是否有 ...

  6. 侧滑面板(对viewGroup的自定义)

    额,好吧,最近一直在做侧滑的事情,到目前为止一共是学了三种方法了,一个是直接加第三方开源框架SlidingMenu,第二给是用DrawerLayout,今天这个是用谷歌官方提供的在新的support- ...

  7. java的properties文件-jdbc优化编程(五)

    通过配置文件能够减小我们的工作量,带来方便. 建立properties文件 1.首先是新建一个dbconfig.properties.然后添加如下代码: driver=com.mysql.jdbc.D ...

  8. 即时通讯软件openfire+spark+smack

    所以我基本上分为三篇文章来介绍此类软件的开发: 第一篇是关于XMPP 协议是啥,IM 是啥以及一个比较有名的开源实现,该开源实现包括三个部分(Spark.Smack和Openfire): 第二篇讲如何 ...

  9. Android性能优化之Listview(ViewHolder重用机制)

    相信大家在很多时候都会用到ListView这个控件,因为确实是用的很多很多,但是有木有遇到过当数据很多很多的时候,往下滑ListView时有时候会卡顿,这就需要我们来优化它了. ListView优化主 ...

  10. C++中const加强

    demo // C语言中的const是一个冒牌货 int main() { // 好像a是一个常量 const int a = 10; int *p = NULL; p = (int *)&a ...