先准备两个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. dmesg 时间转换脚本

    https://linuxaria.com/article/how-to-make-dmesg-timestamp-human-readable perl脚本 #!/usr/bin/perl use ...

  2. mybatis加入条件

    根据http://www.cnblogs.com/friends-wf/p/3799315.html搭建的环境 User.xml加入的 if where判断的 <!-- 根据条件查询一个用户 - ...

  3. Spring 框架的搭建及测试

    1.项目结构如下: 2.com.sxl.pojos==>Student.java package com.sxl.pojos; public class Student { private in ...

  4. Git 创建仓库

    本文将为大学介绍如何创建一个远程的Git仓库.您可以使用一个已经存在的目录作为Git仓库或创建一个空目录. 使用您当前的目录作为Git仓库,我们只需要使它初始化. git init 使用我们指定目录作 ...

  5. Xml+Xslt测试工具

    下载地址:http://download.csdn.net/detail/a497785609/5791359 说明:下载后,修改下Xslt部分的头部:<xsl:stylesheet versi ...

  6. Normalize.css做了哪些事情--看代码

    博主说:本博客文章来源包括转载,翻译,原创,且在文章内均有标明.鼓励原创,支持创作共享,请勿用于商业用途,转载请注明文章链接.本文链接:http://www.kein.pw/?p=80 /*! nor ...

  7. Excel累加上一行的数值

    默认一拖是每一行+1,现在想加任意: =A1+X 然后一拖就可以加X了.

  8. ListView局部更新(非notifyDataSetChanged)

    package com.example.test; import java.util.ArrayList; import java.util.List; import android.app.Acti ...

  9. linux下Oracle数据库实例开机自启动设置

    linux下数据库实例开机自启动设置 1.改动/oratab [root@org54 ~]# vi/etc/oratab     --把N改为Y,例如以下提示 # This file is used ...

  10. 221. Add Two Numbers II【medium】

    You have two numbers represented by a linked list, where each node contains a single digit. The digi ...