JAVA bean与XML互转的利器---XStream
最近在项目中遇到了JAVA bean 和XML互转的需求, 本来准备循规蹈矩使用dom4j忽然想起来之前曾接触过的XStream, 一番研究豁然开朗,利器啊利器, 下来就XStream的一些用法与大家分享。
XStream是大名鼎鼎的thought works下的一个开源项目, 主要功能是提供JAVA bean 和XML文本之间的转换,另外还提供JAVA bean和JSON之间的转换,这个不在本次讨论的范围内。
XStream进行转换是非常简单的,对JAVA bean没有任何要求:
- 不要求对private属性提供access方法(set/get)。
- 不要求提供默认构造函数。
- 基本转换
- 对象起别名
- 处理属性
- 处理List
- 忽略field
- package xstreamTest;
- public class Person {
- private String name;
- private int age;
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getName() {
- return this.name;
- }
- }
转换代码是这样的:
- XStream xstream = new XStream();
- Person person = new Person();
- person.setName("pli");
- person.setAge(18);
- System.out.println(xstream.toXML(person));
我们得到了这样的结果:
- <xstreamTest.Person>
- <name>pli</name>
- <age>18</age>
- </xstreamTest.Person>
- package xstreamTest;
- @XStreamAlias("person")
- public class Person {
- private String name;
- private int age;
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getName() {
- return this.name;
- }
- }
而执行代码会变成这样:
- XStream xstream = new XStream();
- xstream.autodetectAnnotations(true);
- Person person = new Person();
- person.setName("pli");
- person.setAge(18);
- System.out.println(xstream.toXML(person));
- <person>
- <name>pli</name>
- <age>18</age>
- </person>
- @XStreamAlias("person")
- public class Person {
- private String name;
- @XStreamAsAttribute
- private int age;
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getName() {
- return this.name;
- }
- }
- <person age="18">
- <name>pli</name>
- </person>
好玩吧。
- @XStreamAlias("person")
- public class Person {
- private String name;
- @XStreamAsAttribute
- private int age;
- List<String> girlFriends;
- public List<String> getGirlFriends() {
- return girlFriends;
- }
- public void setGirlFriends(List<String> girlFriends) {
- this.girlFriends = girlFriends;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getName() {
- return this.name;
- }
- }
- <person age="18">
- <name>pli</name>
- <girlFriends>
- <string>YuanYuanGao</string>
- <string>QiShu</string>
- <string>BoZhiZhang</string>
- </girlFriends>
- </person>
结
果其实也不赖,XStream在这里提供了一个@XStreamImplicit(itemFieldName=***)的annotation来满足用
户想将List的根节点去掉和改变列表名字的需求,对应到我们的例子上就是去掉<girlFriends>标签和改
变"<string>".我们来看看效果。
- @XStreamAlias("person")
- public class Person {
- private String name;
- @XStreamAsAttribute
- private int age;
- @XStreamImplicit(itemFieldName="girl")
- List<String> girlFriends;
- public List<String> getGirlFriends() {
- return girlFriends;
- }
- public void setGirlFriends(List<String> girlFriends) {
- this.girlFriends = girlFriends;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getName() {
- return this.name;
- }
- }
- <person age="18">
- <name>pli</name>
- <girl>YuanYuanGao</girl>
- <girl>QiShu</girl>
- <girl>BoZhiZhang</girl>
- </person>
5. 忽略属性
- @XStreamAlias("person")
- public class Person {
- private String name;
- @XStreamAsAttribute
- private int age;
- @XStreamImplicit(itemFieldName="girl")
- @XStreamOmitField
- List<String> girlFriends;
- public List<String> getGirlFriends() {
- return girlFriends;
- }
- public void setGirlFriends(List<String> girlFriends) {
- this.girlFriends = girlFriends;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getName() {
- return this.name;
- }
- }
- <person age="18">
- <name>pli</name>
- </person>
- @XStreamAlias("person")
- public class Person {
- private String name;
- @XStreamAsAttribute
- private int age;
- @XStreamImplicit(itemFieldName="girl")
- @XStreamOmitField
- List<String> girlFriends;
- Date birthday;
- public Date getBirthday() {
- return birthday;
- }
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
- public List<String> getGirlFriends() {
- return girlFriends;
- }
- public void setGirlFriends(List<String> girlFriends) {
- this.girlFriends = girlFriends;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getName() {
- return this.name;
- }
- }
- <person age="18">
- <name>pli</name>
- <birthday>2012-08-04 04:35:01.857 UTC</birthday>
- </person>
- public class DateConverter implements Converter {
- @Override
- public boolean canConvert(Class clazz) {
- return (Date.class).equals(clazz);
- }
- @Override
- public void marshal(Object object, HierarchicalStreamWriter writer,
- MarshallingContext context) {
- Date date = (Date) object;
- Calendar calendar = Calendar.getInstance();
- calendar.setTime(date);
- SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd");
- writer.setValue(format.format(calendar.getTime()));
- }
- @Override
- public Object unmarshal(HierarchicalStreamReader arg0,
- UnmarshallingContext arg1) {
- return null;
- }
- }
- public boolean canConvert(Class clazz) 用来检测本converter是否能够转换输入的类型。
- public void marshal(Object object, HierarchicalStreamWriter writer,MarshallingContext context) 序列化的方法(JAVA bean --> XML)
- public Object unmarshal(HierarchicalStreamReader arg0, UnmarshallingContext arg1) 反序列化的方法。因为本例用不到所以没有实现。
- @XStreamAlias("person")
- public class Person {
- private String name;
- @XStreamAsAttribute
- private int age;
- @XStreamImplicit(itemFieldName="girl")
- @XStreamOmitField
- List<String> girlFriends;
- @XStreamConverter(value=DateConverter.class)
- Date birthday;
- public Date getBirthday() {
- return birthday;
- }
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
- public List<String> getGirlFriends() {
- return girlFriends;
- }
- public void setGirlFriends(List<String> girlFriends) {
- this.girlFriends = girlFriends;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getName() {
- return this.name;
- }
- }
- <person age="18">
- <name>pli</name>
- <birthday>2012-50-04</birthday>
- </person>
一个待转换的object首先去查找能够转换这个object的转换器(converter)怎么找呢,就是通过converter的
canConvert(Class clazz)这个方法,返回为true就是可以转换。明白了吧。
这句代码的意思是告诉XStream对象需要自动识别annotation, 这在序列化(JAVA
bean-->XML)的时候没什么问题。但是在反序列化的时候就有问题了,原因官网上说的比较模糊,总之就是不行,只能通过
xstream.processAnnotations(Class clazz) 来显式的注册需要使用annotation的类才行,如果JAVA
bean很多就会比较麻烦。但一般来说JAVA
bean在代码组织结构中都比较集中,如放在听一个package下,这样也好办,可以再程序中将该package下的JAVA
bean都获取,然后使用xstream.processAnnotations(Class[] clazzs) 批量注册。
- @XStreamAlias("person")
- public class Person {
- private String name = "pli";
- @XStreamAsAttribute
- private int age = 19;
- @XStreamImplicit(itemFieldName="girl")
- @XStreamOmitField
- List<String> girlFriends;
- @XStreamConverter(value=DateConverter.class)
- Date birthday = new Date();
- public Date getBirthday() {
- return birthday;
- }
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
- public List<String> getGirlFriends() {
- return girlFriends;
- }
- public void setGirlFriends(List<String> girlFriends) {
- this.girlFriends = girlFriends;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getName() {
- return this.name;
- }
- }
- <person age="18">
- <name>pli</name>
- <birthday>2012-36-04</birthday>
- </person>
girlFriends这个属性压根就没有被序列化,其实我是想让它序列化成这个样子:
- <person age="18">
- <name>pli</name>
- <birthday>2012-36-04</birthday>
- <girlFriends/>
- </person>
转自 http://blog.csdn.net/pushme_pli/article/details/7829621
JAVA bean与XML互转的利器---XStream的更多相关文章
- JAVA Bean和XML之间的相互转换 - XStream简单入门
JAVA Bean和XML之间的相互转换 - XStream简单入门 背景介绍 XStream的简介 注解简介 应用实例 背景介绍 我们在工作中经常 遇到文件解析为数据或者数据转化为xml文件的情况, ...
- JAXB java类与xml互转
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向 ...
- Java bean和json互转时,屏蔽某个属性
有的时候我们把java bean 转换成json的时候,希望屏蔽掉某个属性,这时可以在java bean的属性上加上@JsonIgnore注解,在com.fasterxml.jackson.annot ...
- java bean 转换工具
考量要素: 1.简单的约定优于配置的同名属性copy 2.嵌套属性copy 3.flattern(扁平化)支持,要支持N层结构的copy到一层结构. 4.性能 如下这个网页,里面提到了好多工具. ht ...
- 使用JAXB实现Bean与Xml相互转换
最近几天,我自己负责的应用这边引入了一个新的合作方,主要是我这边调用他们的接口,但是有个很坑的地方,他们传参居然不支持json格式,并且只支持xml格式进行交互,于是自己写了一个工具类去支持bean与 ...
- Java JSON、XML文件/字符串与Bean对象互转解析
前言 在做web或者其他项目中,JSON与XML格式的数据是大家经常会碰见的2种.在与各种平台做数据对接的时候,JSON与XML格式也是基本的数据传递格式,本文主要简单的介绍JSON/XML ...
- Spring基础篇——通过Java注解和XML配置装配bean
自动化装配的确有很大的便利性,但是却并不能适用在所有的应用场景,比如需要装配的组件类不是由自己的应用程序维护,而是引用了第三方的类库,这个时候自动装配便无法实现,Spring对此也提供了相应的解决方案 ...
- Java Jaxb JavaBean与XML互转
1.Jaxb - Java Arcitecture for XML Binding 是业界的一个标准,是一项能够依据XML Schema产生Java类的技术. Jaxb2.0是Jdk1.6的组成部分. ...
- Spring基础篇——通过Java注解和XML配置装配bean(转载)
作者:陈本布衣 出处:http://www.cnblogs.com/chenbenbuyi 本文版权归作者和博客园共有,欢迎转载分享,但必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留 ...
随机推荐
- Mysql_存储功能
先上一段代码: -->DELIMETER; ----加上这一句:DELIMETER的作用是设定客户机的分隔符,表示用//包含的是一段程序,一起执行,而不是见到“:”就执行 结束的时候写上 ...
- Java多线程编程总结(学习博客)
Java多线程编程总结:网址:http://lavasoft.blog.51cto.com/62575/27069/
- java星座、年龄、日期等
星座: public static String getStar(Date date) { Calendar cal = Calendar.getInstance(); cal.setTime(dat ...
- 【html】【16】高级篇--毛玻璃效果[模糊]
参考: http://www.zhangxinxu.com/wordpress/2013/11/%E5%B0%8Ftip-%E4%BD%BF%E7%94%A8css%E5%B0%86%E5%9B%BE ...
- 【mysql】【分组】后取每组的top2
DROP TABLE IF EXISTS `tb1`; CREATE TABLE `tb1` ( `id` ) NOT NULL AUTO_INCREMENT, `a` ) DEFAULT NULL, ...
- jQuery 源码分析4: jQuery.extend
jQuery.extend是jQuery最重要的方法之一,下面看看jQuery是怎样实现扩展操作的 // 如果传入一个对象,这个对象的属性会被添加到jQuery对象中 // 如果传入两个或多个对象,所 ...
- wait(...) notify() notifyAll()
简介 wait.notify.notifyAll是Java中3个与线程有关的方法,它们都是Object类中的方法. 其中,wait方法有3个重载形式: 1.wait() 2.wait(long tim ...
- 配置php的CAS客户端
1.下载安装xmapp 2.开启Apache服务. 3.下载php的CAS客户端源码包(我使用的是CAS-1.2.0.tgz),解压到xmap的htdocs目录下(D:\xmapp\htdocs),进 ...
- Json概述以及python对json的相关操作《转》
什么是json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programm ...
- jQuery—一些常见方法(3)【width(),innerWidth(),outerWidth()】
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...