先准备两个bean

 public class Book {
private int bookId;
private String bookName;
private String bookCode; ...(get和set方法省略)
}
public class BookShelf {
private int number;
private List<Book> books;
private String remark;
private Date date;
public BookShelf(){
books=new ArrayList<Book>();
}
...(get和set方法省略)
}

使用

 Book book1=new Book();
book1.setBookCode("001");
book1.setBookId(1);
book1.setBookName("java编程");
Book book2=new Book();
book2.setBookCode("002");
book2.setBookId(2);
book2.setBookName("jsp编程");
BookShelf bookShelf=new BookShelf();
bookShelf.setNumber(1);
bookShelf.setRemark("第一个书架");
bookShelf.getBooks().add(book1);
bookShelf.getBooks().add(book2);
bookShelf.setDate(new Date()); XStream xStream=new XStream(new DomDriver());
String str= xStream.toXML(bookShelf);
System.out.println(str);

输出结果:

<xml.BookShelf>
<number>1</number>
<books>
<xml.Book>
<bookId>1</bookId>
<bookName>java编程</bookName>
<bookCode>001</bookCode>
</xml.Book>
<xml.Book>
<bookId>2</bookId>
<bookName>jsp编程</bookName>
<bookCode>002</bookCode>
</xml.Book>
</books>
<remark>第一个书架</remark>
<date>2014-07-04 07:03:34.485 UTC</date>
</xml.BookShelf>

输出的结果里,类名转换为节点名,但前面多了个xml(不爽),时间格式字符串也不爽,那下面就来改造一下吧!

1、先处理一下时间格式问题,这个需要我们自己定义date类型的字段要怎么转换,当然xstream为我们提供了接口,实现它吧

public class MuConverter implements Converter {
//判断字段是否属于要转换的类型
@Override
public boolean canConvert(Class paramClass) {
return Date.class.isAssignableFrom(paramClass);
} //对象转化为xml
@Override
public void marshal(Object object, HierarchicalStreamWriter writer,
MarshallingContext context) {
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
writer.setValue(format.format(object));
} //xml转化为对象
@Override
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
try {
Date date= DateFormat.getInstance().parse(reader.getValue());
return date;
} catch (ParseException e) {
return null;
}
}
}

2、为各字段换个名字

xStream.alias("BookShelf", BookShelf.class);
xStream.alias("Book", Book.class);
//修改节点名称
xStream.aliasField("other", BookShelf.class,"remark"); //字段不做为节点,而是属性
xStream.aliasAttribute(Book.class, "bookId", "id");
xStream.useAttributeFor(Book.class, "bookId"); //去掉集体节点的父节点
//xStream.addImplicitCollection(BookShelf.class, "books"); //自定义转换器
xStream.registerConverter(new MuConverter());*/

输出结果

<BookShelf>
<number>1</number>
<books>
<Book id="1">
<bookName>java编程</bookName>
<bookCode>001</bookCode>
</Book>
<Book id="2">
<bookName>jsp编程</bookName>
<bookCode>002</bookCode>
</Book>
</books>
<other>第一个书架</other>
<date>2014-07-04</date>
</BookShelf>

3、如果觉得上面的指定代码太复杂了,也可以使用注解来实现
首先来看两个bean

@XStreamAlias("Book")
public class Book { @XStreamAlias("id")
@XStreamAsAttribute
private int bookId;
private String bookName;
private String bookCode; ...
}
@XStreamAlias("BookShelf")
public class BookShelf {
private int number;
//去掉集体节点的父节点
//@XStreamImplicit
private List<Book> books;
private String remark;
@XStreamConverter(MuConverter.class)
private Date date;
public BookShelf(){
books=new ArrayList<Book>();
} ...
}

没有注解的字段按字段名默认来转换
直接调用方法即可

 xStream.autodetectAnnotations(true);
//也可以分别调用
//xStream.processAnnotations(BookShelf.class);
//xStream.processAnnotations(Book.class);

上面的是对象转换为xml,现在来实现xml转换为对象,很简单(注意:xml转换成对象,需要通过上面的别名或注解的方式来指明转换,不能直接调用下面的代码)

XStream xStream=new XStream(new DomDriver());
xStream.autodetectAnnotations(true);
BookShelf bookShelf2=(BookShelf)xStream.fromXML(str);

序列化和反序列化支持

不多说,直接上代码

1、反序列化

ObjectInputStream input=xStream.createObjectInputStream(inputStream);
BookShelf bookShelf=(BookShelf)input.readObject();

2、序列化

ObjectOutputStream out=xstream.createObjectOutputStream(outputStream);
out.writeObject(bookShelf);
out.close();

3、PrettyPrintWriter、CompactWriter
这两个是XStream自带的用于输出xml文件,区别在于后者输出的xml是连接的,前者输出的是有格式的xml

XStream的基本使用的更多相关文章

  1. XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法

            在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...

  2. XStream xml 解析框架使用笔记

    1. xml的标签可以映射为类.类成员变量 2. 有子标签的标签映射为类,没有子标签的便签映射为类成员变量 3. 类名.类成员变量名如与标签名不一致需要通过注解或代码设置别名 // 类名 @XStre ...

  3. Xstream学习资料

    java中有关xml操作的,我们项目中首推Xstream.至于原因不说了.跟着大众的脚步走应该没错的.有关Xstream的文档如下. 官方文档 XStream完美转换XML.JSON XStream实 ...

  4. XStream简单入门

    简单的讲,XStream 涉及的就五个知识点:详情参考 官网 混叠,注解,转换器,对象流和操作json! 下面就用几个简单的例子来实现上述五个知识点! 基本步骤: 第1步:创建XStream对象. 通 ...

  5. 使用XStream解析MXL文件用到的jar包---xpp3_min-1.1.3.4.O.jar和xstream-1.3.1.jar

    使用XStream解析MXL文件用到的jar包---xpp3_min-1.1.3.4.O.jar和xstream-1.3.1.jar

  6. Xstream解析XML

    <oschina> <catalog>1</catalog> <newsCount>0</newsCount> <pagesize&g ...

  7. 打造完美的xml技术解决方案(dom4j/xstream)

    转: XML 技术是随着 Java 的发展而发展起来的.在 XML 出现之前对于简单的数据格式通常是存储在 ini 配置文件等文本文件中,复杂的格式则采用自定义的文件格式,因此对于每种文件格式都要有专 ...

  8. XStream学习笔记

    XStream 所需jar包: xstream-1.3.jar xpp3_min-1.1.4c.jar xmlpull-1.1.3.1.jar 目录: 1.注解去除,标签中带有包名的节点 2.注解修改 ...

  9. Java对象表示方式2:XStream实现对对象的XML化

    上一篇文章讲到了使用Java原生的序列化的方式来表示一个对象.总结一下这种对象表示方式的优缺点: 1.纯粹的Java环境下这种方式可以很好地工作,因为它是Java自带的,也不需要第三方的Jar包的支持 ...

  10. XStream、JAXB 日期(Date)、数字(Number)格式化输出xml

    XStream.Jaxb是java中用于对象xml序列化/反序列化 的经典开源项目,利用它们将对象转换成xml时,经常会遇到日期(Date).数字按指定格式输出的需求,下面是使用示例: 一.日期字段格 ...

随机推荐

  1. Rxjava2.0 链式请求异常处理

    使用Rxjava2.0的过程中,难免会遇到链式请求,而链式请求一般都是第一个抛异常,那么后面的请求都是不会走的.现在来讨论一下链式请求的一种异常处理方法.例如: 一个登录-->通过登录返回的to ...

  2. android精确绘制文字位置的方法

    android 中使用Canvas的drawText绘制文本的位置,是基于基线的. 例如以下图: 当中字母Q的小尾巴在横线以下了. 怎么样找准字母的中心位置呢? 先看以下的样例:(右边的数字,表示字体 ...

  3. OOP Class具体解释

    对象[编辑] 对象(Object)是类的实例.比如."狗"这个类列举狗的特点,从而使这个类定义了世界上全部的狗. 而莱丝这个对象则是一条详细的狗,它的属性也是详细的.狗有皮毛颜色. ...

  4. Mybatis <if>标签

    格式:<if test=""> sql语句 </if> <select id="selectByName" resultType= ...

  5. 【OpenGL基础篇】——使用面向对象方法封装OpenGL函数(二)

    今天封装了一个Line类.负责在昨天写的窗体上绘制线条. OpenGL画图是通过给glBegin函数设置參数达成的,绘制线条有三个不同的參数: GL_LINES : 绘制连接两个点的线段(绘制的端点位 ...

  6. 【WEB】jQuery获取页面回滚或跳转事件

    1.效果: 2.Jquery: //记得引入jquery.min.js <script type="text/javascript"> $(function(){ wi ...

  7. LaTeX 中使用三级标题

    需要在导言区加入命令:\setcounter{secnumdepth}{4} 而后: \section{一级标题} \subsection{二级标题} \subsubsection{三级标题}

  8. Swift不等于nil

    我照着书上的例子写下了如下代码,运行后发现提示Nil cannot be assigned to type 'Int' if i!=nil {//Nil cannot be assigned to t ...

  9. MongoDB GridFS最佳应用概述

    <MongoDB GridFS最佳应用概述> 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs GridFS是MongoDB数据库之上的一个简单 ...

  10. 调试JDK1.8源码的方法

    背景 在学习JDK源码的时候,免不了需要调试JDK的源码. 比如:想理解ConcurrentHashMap的put(K k, V v)方法,JDK自带的rt.jar文件是支持断点调试,但是却看不到变量 ...