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. TensorFlow实验环境搭建

    初衷: 由于系统.平台的原因,网上有各种版本的tensorflow安装教程,基于linux的.mac的.windows的,各有不同,tensorflow的官网也给出了具体的安装命令.但实际上,即使te ...

  2. 《Shazam It! Music Recognition Algorithms, Fingerprinting, and Processing》译文

    最近看到一篇老外写的博客,简单介绍了shazam的工作原理.图非常好,所以就把它翻译成中文,希望对搞听歌识曲的人有帮助. 你可能遇到这样的场景:在酒吧或者餐厅听到你非常熟悉的歌,也许你曾经听过无数次, ...

  3. ORACLE时间日期格式使用总结(参考网上资料汇总)

    Oracle时间日期操作 sysdate+(5/24/60/60) 在系统时间基础上延迟5秒 sysdate+5/24/60 在系统时间基础上延迟5分钟 sysdate+5/24 在系统时间基础上延迟 ...

  4. Java程序员必须掌握的线程知识-Callable和Future

    Callable和Future出现的原因 创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需 ...

  5. Apache Beam—透视Google统一流式计算的野心

    Google是最早实践大数据的公司,目前大数据繁荣的生态很大一部分都要归功于Google最早的几篇论文,这几篇论文早就了以Hadoop为开端的整个开源大数据生态,但是很可惜的是Google内部的这些系 ...

  6. EBS库存(INV)模块常用表

     select * from org_organization_definitions库存组织 select * from mtl_parameters组织参数 select * from mtl ...

  7. introduction of velocity

    一.velocity 简介 基于java 的模板引擎,apache 旗下的开源软件项目. 目的在于隔离 表示层和业务逻辑层,当然现在做的不仅仅是这些. 二.应用场景 web 应用程序:创建html页面 ...

  8. Android源码分析—深入认识AsyncTask内部机制

    本文转载http://blog.csdn.net/singwhatiwanna/article/details/17596225该博主博文,谢谢该博主提供的好文章! 前言 什么是AsyncTask,相 ...

  9. linux下字节对齐

    一,内存地址对齐的概念    计算机内存中排列.访问数据的一种方式,包含基本数据对齐和结构体数据对齐.    32位系统中,数据总线宽度为32,每次能够读取4字节数据.地址总线为32,最大寻址空间为4 ...

  10. 02_MyBatis项目结构,所需jar包,ehcache.xml配置,log4j.properties,sqlMapConfig.xml配置,SqlMapGenerator.xml配置

     项目结构(所需jar包,配置文件) sqlMapConfig.xml的配置内容如下: <?xmlversion="1.0"encoding="UTF-8&qu ...