先准备两个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. vue - check-versions.js for child_process

    webpack之类的配置文件. webpack.base.conf.js

  2. iOS开发-使用storyboard实现UILabel的自适应高度(iOS8)

    好久没有写博客了.以后多写些博客,对自己是一种提升.对大家也是一种帮助 近期特别痴迷storyboard和xib的可视化编程,在写项目的时候遇到个问题就是怎样使UILabel自适应高度,查了好多文章博 ...

  3. react 设置代理(proxy) 实现跨域请求

    一,对于使用creat-react-app构建的项目,可以直接在package.json下配置,具体如下 "proxy": "http://api.xxxx.com&qu ...

  4. CSS优先级的详细解说

    一.什么是CSS优先级? 所谓CSS优先级,即是指CSS样式在浏览器中被解析的先后顺序. 二.CSS优先级规则 既然样式有优先级,那么就会有一个规则来约定这个优先级,而这个“规则”就是本次所需要讲的重 ...

  5. tar排除指定目录打包

    转载自:http://hxl2009.blog.51cto.com/779549/476513 假设 test目录下有 1 2 3 4 5 这5个目录现在要将 3 4 5目录tar打包,1和2目录不要 ...

  6. unity, break prefab instance

    菜单->GameObject->Break Prefab Instance,可以打断prefab实例与prefab的连接. 一个用处是:比如想从sceneA拷贝一部分Hierarchy结构 ...

  7. Docker Python API 与 Docker Command

    span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span. ...

  8. NGUI的一个bug记录

    在当前帧内触发按钮事件,然后把click事件的list删去,再添加,这时候会再次触发. 不确定,先记一下

  9. vivado error [Labtools 27-2149]

    使用vivado2014.3时遇到了这种错误 ERROR: [Labtools 27-2149] File E:/project/V7_PCIE/prj/PhasedProject/M_PcieGen ...

  10. Vivado Logic Analyzer的使用

    chipscope中,通常有两种方法设置需要捕获的信号.1.添加cdc文件,然后在网表中寻找并添加信号2.添加ICON.ILA和VIO的IP Core 第一种方法,代码的修改量小,适当的保留设计的层级 ...