- 浏览: 73932 次
- 性别:
- 来自: 北京
最新评论
-
TopLongMan:
...
weblogic与websphere的区别———转 -
wendellup_account1:
thanks.
tomcat 只输ip或localhost就可以直接访问项目的步骤 -
kittychina:
不要把程序员的低薪归结为程序员自己不努力!虽然我们都提倡要努力 ...
程序员前途
XStream是thoughtworks公司发布的一个简单的Java类库,用于将JavaBean序列化为XML,并且能够将XML文件反向转换为JavaBean。本文根据XStream1.3.1版本对其基本使用做简单介绍,参考资料来源于官方教程和API。
壹、快速上手
通过一个简单的示例来演示XStream的基本使用,你会发现使用XStream在JavaBean和XML之间的转换会有多么的便捷。
1.1 创建序列化的类
public class Person {
private String firstname;
private String lastname;
private PhoneNumber phone;
private PhoneNumber fax;
// ... constructors and methods
}
public class PhoneNumber {
private int code;
private String number;
// ... constructors and methods
}
注意:
请注意上面两个类的字段都是私有的,XStream并不关心字段的可见性,没有getter/setter也没关系,也不要求具有默认的构造函数。
1.2 初始化XStream
要使用XStream,使用如下代码实例化XStream类:
XStream xstream = new XStream();
你需要将xstream-[版本].jar和xpp3-[版本].jar引入到项目的classpath中。XPP3是一个速度非常快的拉解析(pull-parse)的实现,如果你不想使用XPP3,你可以使用标准的JAXP DOM解析器来代替:
XStream xstream = new XStream(new DomDriver()); // does not require XPP3 library
现在,你可以对自定义的类名创建别名以对应生成的XML元素名称更加简洁,这是使用Xstream过程中唯一需要映射的,并且这是可选的。
xstream.alias("person", Person.class);
xstream.alias("phonenumber", PhoneNumber.class);
注意:这是可选的步骤,没有这一步Xstream也能够正常工作,但是XML的元素名会包含类的完全路径(包含报名),造成XML不够简洁。
1.3 序列化对象至XML
创建一个Person类的实例,并填充实例的字段:
Person joe = new Person("Joe", "Walnes");
joe.setPhone(new PhoneNumber(123, "1234-456"));
joe.setFax(new PhoneNumber(123, "9999-999"));
要想将以上创建的对象序列化为XML,只需调用Xstream对象的toXML(Object)方法即可。
String xml = xstream.toXML(joe);
输出的的XML如下:
<person>
<firstname>Joe</firstname>
<lastname>Walnes</lastname>
<phone>
<code>123</code>
<number>1234-456</number>
</phone>
<fax>
<code>123</code>
<number>9999-999</number>
</fax>
</person>
1.4 从XML反序列化至对象
根据序列化的XML重建一个JavaBean,只需调用Xstream对象的fromXML(String)方法即可。
Person newJoe = (Person)xstream.fromXML(xml);
1.5 快速上手小结
(1) xstream.alias(String elementName, Class cls);
该方法用于创建自定义类类名所对应XML元素的名称。
(2) xstream.toXML(Object obj);
该方法用于将传入的JavaBean对象序列化为XML字符串并返回。
(3) xstream.fromXML(String xml);
该方法用于将传入的XML字符串反向序列化为JavaBean对象。
贰、使用别名
2.1 类别名
Xstream xstream = new Xstream();
String xml = xstream.toXML(obj);
上面代码将对象obj序列化为XML,默认情况下,将一个类的对象序列化为XML,则该类所对应的XML元素名称会以类全名(包名+类名)的方式命名,如Person类的包名为com.thoughtworks,那么Person实例所序列化的XML元素名称将为:
<com.thoughtworks.Person> …… </ com.thoughtworks.Person >
显然,这种方式所生成的XML不够简洁,也不利于人工阅读,所以XStream给我们提供了类别名来解决这一问题,
xstream.alias(String 类别名, Class 类定义);
如:我们使用如下代码将Person类定义别名
xstream.alias(“person”, Person.class);
这样我们生成的XML字符串就会变成<person>…</person>;
注意:
当生成XML时指定了类的别名,在读取生成的XML转换为对象时,也需要为其指定别名,否则XStream将无法识别,字段、属性、包别名都是同样如此,下不赘述。
2.2 字段别名
和类别名同样的道理,类的字段也可以定义别名。
aliasField(String 字段别名, Class 类定义, String 字段名);
如Person类有字段firstName,我们想在生成的XML中将此字段名改为first,则我们可以使用如下代码:
xstream.aliasField("first", Person.class, "firstName");
则生成的XML为:<Person><first>...</first>...
2.3 属性别名
XStream可以将对象的字段映射为XML元素的属性:
useAttributeFor(Class define din, String fieldnames);
并且可以为指定的属性指定别名:
aliasAttribute(Class 类定义, String 属性名, String 属性别名);
xstream.aliasAttribute(Person.class, “”);
<Person FirstName=”xusweeter”>。。。
注意:
读取XML属性时,需要使用如下方法将属性映射为类的字段,否则XStream将不做任何处理。
useAttributeFor(Class 类定义, String 字段名);
2.4 包别名
Xstream还可以对类的包名指定别名。
aliasPackage(String name, String pkgName)
原来的包名为com.thoughtworks,经过如下代码修改为org.thoughtworks。
aliasPackage(“org.thoughtworks”, com.thoughtworks);
叁、集合说明
JavaBean中会经常用到集合对象,如List,刚开始学习时,对于集合总是感觉无从下手,经过琢磨,对其有大体的了解,特别说明一下。
首先我们构建一个包含集合字段的类:
public class Blog {
private List articles;
public void add(String article){
this.articles.add(article);
}
}
我们创建一个Blog对象,并填充它的字段。
Blog blog = new Blog();
blog.add("chapter1");
blog.add("chapter2");
将此对象序列化为XML:
XStream xstream = new XStream();
System.out.println(xstream.toXML(blog));
我们将会得到如下XML:
<collection.Blog>
<articles>
<string>chapter1</string>
<string>chapter2</string>
</articles>
</collection.Blog>
着色的部分就是集合字段生成的XML,所以我们看到有重复的相同标签的XML元素就应当和集合建立联系,实验证明使用代码:
Blog blog1 = (Blog)xstream.fromXML(xstream.toXML(blog));
可以将上述生成的XML反向序列化为Blog对象。
3.1 隐含集合:
另外,XStream类为我们提供了另外一个方法:
addImplicitCollection(Class ownerType, String fieldName)
该方法的作用是引入隐含集合(Implicit Collection),即某个类包含集合字段,引入隐含集合方法可以在生成的XML中并不显示集合字段的标签。
如:加入如下代码xstream.addImplicitCollection(Blog.class, "articles")生成的XML如下:
<collection.Blog>
<string>chapter1</string>
<string>chapter2</string>
</collection.Blog>
和之前的XML比较发现少了<articles></articles>标签,这就是隐含集合。要特别注意,上面的两个<string>标签并不是Blog类的两个别名为string的字段,而是一个集合字段的内容;所以再次强调,如果发现有紧邻的重复标签,要把它们看作是集合的内容,而不是多个字段(事实上也无法解析为含有多个相同名称的字段)。
肆、对象引用
在Java中经常会碰到对象引用的情况,如定义了一个对象A,B对象会引用对象A。那么在对象引用发生时,在序列化的XML中该如何表述呢?
XStream在XML中能够通过相对XPath、绝对XPath或者IDs模式表示对象之间的引用关系。模式可以通过方法setMode(int)来更改。通过引用可以简短XML代码量,避免冗余,但是降低了可阅读性。
XStream的模式:
l XStream.XPATH_RELATIVE_REFERENCES(默认)
默认的引用方式,通过XPath的相对位置来引用
l XStream.XPATH_ABSOLUTE_REFERENCES
绝对引用方式
l XStream.ID_REFERENCES
ID引用方式,通过对元素编号来引用
l XStream.NO_REFERENCES
无引用方式
下面我们来构建一个示例来说明各种引用方式,比如有如下引用:
List order = new ArrayList();
order.add(bj);
order.add(bj);
order.add(order);
一个集合order,连续两次添加了同一个对象,最后又把自身添加进去,详细的类定义见官网“Object References”章节。
4.1 XPath相对引用
XStream在默认的情况下是以XPATH_RELATIVE_REFERENCES模式来表示对象间的引用关系。
XStream xstream = new XStream();
System.out.println(xstream.toXML(order));
生成的XML结果如下:
<list>
<CD>
<id>Next Road Cross</id>
</CD>
<CD reference="../CD"/>
<list reference=".."/>
</list>
请注意上面着色和加粗部分的引用是以自身和目标的相对关系来引用的。
4.2 XPath绝对引用
XPath绝对引用模式下是以根节点开始直到目标对象的结构关系来引用的,修改XStream的模式:
xStream.setMode(XStream.XPATH_ABSOLUTE_REFERENCES);
得到结果如下,请注意加粗着色部分的代码:
<list>
<CD>
<id>Next Road Cross</id>
</CD>
<CD reference="/list/CD"/>
<span style
壹、快速上手
通过一个简单的示例来演示XStream的基本使用,你会发现使用XStream在JavaBean和XML之间的转换会有多么的便捷。
1.1 创建序列化的类
public class Person {
private String firstname;
private String lastname;
private PhoneNumber phone;
private PhoneNumber fax;
// ... constructors and methods
}
public class PhoneNumber {
private int code;
private String number;
// ... constructors and methods
}
注意:
请注意上面两个类的字段都是私有的,XStream并不关心字段的可见性,没有getter/setter也没关系,也不要求具有默认的构造函数。
1.2 初始化XStream
要使用XStream,使用如下代码实例化XStream类:
XStream xstream = new XStream();
你需要将xstream-[版本].jar和xpp3-[版本].jar引入到项目的classpath中。XPP3是一个速度非常快的拉解析(pull-parse)的实现,如果你不想使用XPP3,你可以使用标准的JAXP DOM解析器来代替:
XStream xstream = new XStream(new DomDriver()); // does not require XPP3 library
现在,你可以对自定义的类名创建别名以对应生成的XML元素名称更加简洁,这是使用Xstream过程中唯一需要映射的,并且这是可选的。
xstream.alias("person", Person.class);
xstream.alias("phonenumber", PhoneNumber.class);
注意:这是可选的步骤,没有这一步Xstream也能够正常工作,但是XML的元素名会包含类的完全路径(包含报名),造成XML不够简洁。
1.3 序列化对象至XML
创建一个Person类的实例,并填充实例的字段:
Person joe = new Person("Joe", "Walnes");
joe.setPhone(new PhoneNumber(123, "1234-456"));
joe.setFax(new PhoneNumber(123, "9999-999"));
要想将以上创建的对象序列化为XML,只需调用Xstream对象的toXML(Object)方法即可。
String xml = xstream.toXML(joe);
输出的的XML如下:
<person>
<firstname>Joe</firstname>
<lastname>Walnes</lastname>
<phone>
<code>123</code>
<number>1234-456</number>
</phone>
<fax>
<code>123</code>
<number>9999-999</number>
</fax>
</person>
1.4 从XML反序列化至对象
根据序列化的XML重建一个JavaBean,只需调用Xstream对象的fromXML(String)方法即可。
Person newJoe = (Person)xstream.fromXML(xml);
1.5 快速上手小结
(1) xstream.alias(String elementName, Class cls);
该方法用于创建自定义类类名所对应XML元素的名称。
(2) xstream.toXML(Object obj);
该方法用于将传入的JavaBean对象序列化为XML字符串并返回。
(3) xstream.fromXML(String xml);
该方法用于将传入的XML字符串反向序列化为JavaBean对象。
贰、使用别名
2.1 类别名
Xstream xstream = new Xstream();
String xml = xstream.toXML(obj);
上面代码将对象obj序列化为XML,默认情况下,将一个类的对象序列化为XML,则该类所对应的XML元素名称会以类全名(包名+类名)的方式命名,如Person类的包名为com.thoughtworks,那么Person实例所序列化的XML元素名称将为:
<com.thoughtworks.Person> …… </ com.thoughtworks.Person >
显然,这种方式所生成的XML不够简洁,也不利于人工阅读,所以XStream给我们提供了类别名来解决这一问题,
xstream.alias(String 类别名, Class 类定义);
如:我们使用如下代码将Person类定义别名
xstream.alias(“person”, Person.class);
这样我们生成的XML字符串就会变成<person>…</person>;
注意:
当生成XML时指定了类的别名,在读取生成的XML转换为对象时,也需要为其指定别名,否则XStream将无法识别,字段、属性、包别名都是同样如此,下不赘述。
2.2 字段别名
和类别名同样的道理,类的字段也可以定义别名。
aliasField(String 字段别名, Class 类定义, String 字段名);
如Person类有字段firstName,我们想在生成的XML中将此字段名改为first,则我们可以使用如下代码:
xstream.aliasField("first", Person.class, "firstName");
则生成的XML为:<Person><first>...</first>...
2.3 属性别名
XStream可以将对象的字段映射为XML元素的属性:
useAttributeFor(Class define din, String fieldnames);
并且可以为指定的属性指定别名:
aliasAttribute(Class 类定义, String 属性名, String 属性别名);
xstream.aliasAttribute(Person.class, “”);
<Person FirstName=”xusweeter”>。。。
注意:
读取XML属性时,需要使用如下方法将属性映射为类的字段,否则XStream将不做任何处理。
useAttributeFor(Class 类定义, String 字段名);
2.4 包别名
Xstream还可以对类的包名指定别名。
aliasPackage(String name, String pkgName)
原来的包名为com.thoughtworks,经过如下代码修改为org.thoughtworks。
aliasPackage(“org.thoughtworks”, com.thoughtworks);
叁、集合说明
JavaBean中会经常用到集合对象,如List,刚开始学习时,对于集合总是感觉无从下手,经过琢磨,对其有大体的了解,特别说明一下。
首先我们构建一个包含集合字段的类:
public class Blog {
private List articles;
public void add(String article){
this.articles.add(article);
}
}
我们创建一个Blog对象,并填充它的字段。
Blog blog = new Blog();
blog.add("chapter1");
blog.add("chapter2");
将此对象序列化为XML:
XStream xstream = new XStream();
System.out.println(xstream.toXML(blog));
我们将会得到如下XML:
<collection.Blog>
<articles>
<string>chapter1</string>
<string>chapter2</string>
</articles>
</collection.Blog>
着色的部分就是集合字段生成的XML,所以我们看到有重复的相同标签的XML元素就应当和集合建立联系,实验证明使用代码:
Blog blog1 = (Blog)xstream.fromXML(xstream.toXML(blog));
可以将上述生成的XML反向序列化为Blog对象。
3.1 隐含集合:
另外,XStream类为我们提供了另外一个方法:
addImplicitCollection(Class ownerType, String fieldName)
该方法的作用是引入隐含集合(Implicit Collection),即某个类包含集合字段,引入隐含集合方法可以在生成的XML中并不显示集合字段的标签。
如:加入如下代码xstream.addImplicitCollection(Blog.class, "articles")生成的XML如下:
<collection.Blog>
<string>chapter1</string>
<string>chapter2</string>
</collection.Blog>
和之前的XML比较发现少了<articles></articles>标签,这就是隐含集合。要特别注意,上面的两个<string>标签并不是Blog类的两个别名为string的字段,而是一个集合字段的内容;所以再次强调,如果发现有紧邻的重复标签,要把它们看作是集合的内容,而不是多个字段(事实上也无法解析为含有多个相同名称的字段)。
肆、对象引用
在Java中经常会碰到对象引用的情况,如定义了一个对象A,B对象会引用对象A。那么在对象引用发生时,在序列化的XML中该如何表述呢?
XStream在XML中能够通过相对XPath、绝对XPath或者IDs模式表示对象之间的引用关系。模式可以通过方法setMode(int)来更改。通过引用可以简短XML代码量,避免冗余,但是降低了可阅读性。
XStream的模式:
l XStream.XPATH_RELATIVE_REFERENCES(默认)
默认的引用方式,通过XPath的相对位置来引用
l XStream.XPATH_ABSOLUTE_REFERENCES
绝对引用方式
l XStream.ID_REFERENCES
ID引用方式,通过对元素编号来引用
l XStream.NO_REFERENCES
无引用方式
下面我们来构建一个示例来说明各种引用方式,比如有如下引用:
List order = new ArrayList();
order.add(bj);
order.add(bj);
order.add(order);
一个集合order,连续两次添加了同一个对象,最后又把自身添加进去,详细的类定义见官网“Object References”章节。
4.1 XPath相对引用
XStream在默认的情况下是以XPATH_RELATIVE_REFERENCES模式来表示对象间的引用关系。
XStream xstream = new XStream();
System.out.println(xstream.toXML(order));
生成的XML结果如下:
<list>
<CD>
<id>Next Road Cross</id>
</CD>
<CD reference="../CD"/>
<list reference=".."/>
</list>
请注意上面着色和加粗部分的引用是以自身和目标的相对关系来引用的。
4.2 XPath绝对引用
XPath绝对引用模式下是以根节点开始直到目标对象的结构关系来引用的,修改XStream的模式:
xStream.setMode(XStream.XPATH_ABSOLUTE_REFERENCES);
得到结果如下,请注意加粗着色部分的代码:
<list>
<CD>
<id>Next Road Cross</id>
</CD>
<CD reference="/list/CD"/>
<span style
- xstream-1.3.jar (401.5 KB)
- 下载次数: 7
发表评论
-
Deployment failure on Tomcat 6.x. Could not copy all resources
2013-02-18 10:52 1560在myeclipse 部署项目的时候报:Deployment ... -
Java用native2ascii命令做unicode编码转换
2012-11-15 18:57 882背景:在做Java开发的时候,常常会出现一些乱码,或者无法正确 ... -
控制台有如下信息:handling transient entity in delete processing
2012-10-24 11:28 3904通过dao的get方法得到了相应的永续对象,再用dao的del ... -
hibernate中get方法和load方法的根本区别
2012-10-23 11:27 753hibernate中get方法和load方 ... -
weblogic与websphere的区别———转
2012-09-17 17:04 14341. 可靠性,可扩展性,可用性 根据最近的公开评测和客 ... -
struts2 <s:property/>标签的使用--输出时间格式转换
2012-09-12 15:17 24471.按需输出特定长度的字符 例:<s:property ... -
struts2 标签
2012-09-11 16:49 878Struts2常用标签总结 一 ... -
ids for this class must be manually assigned before calling save()..
2012-09-06 11:39 832引起问题的原因: 由Hibernate根据数据库表自动生成的& ... -
MyEclipse自动提示设置、spring 自动提示
2012-09-04 10:18 2287环境:MyEclipse 6.5 问题 ... -
MyEclipse中删除添加的Hibernate Capabilities
2012-09-03 16:33 1005我是通过菜单MyEclipse->Project Cap ... -
JSP中的两种包含页面的方法
2012-09-03 10:16 698[java] view plaincopy //第一种:inc ... -
log4j的配置详解
2012-08-30 11:05 711第一步:加入log4j-1.2.8.j ... -
weblogic搭建环境遇到的错误
2012-07-26 16:47 51872012-07-23 16:31:54,587 ERROR [ ... -
Sun 自带的Gzip压缩解压xml实例
2012-07-16 17:27 1068import java.io.BufferedInputStr ... -
linux 安装 jrmc
2012-07-16 11:24 1008下载jrockit-jdk1.6.0_20-R28.1.0-4 ... -
hibernate延迟加载
2012-06-21 17:04 742延迟加载: 首先说明Hibernate3延迟加载只对其中的l ... -
为什么重写 equals 和 hashCode 方法
2012-06-21 13:05 905一. 关键字: Object 、 eq ... -
tomcat 启动时加载项目
2012-05-30 15:22 768启动加载项目配置 在server.xml中添加如下: < ... -
tomcat6.0.20配置jndi,spring配置
2012-05-30 15:15 7031、环境 1)tomcat 6.0.20 ... -
request.getRemoteAddr()和request.getRemoteHost()
2012-05-24 17:12 1046request.getRemoteAddr()是获得客户端的i ...
相关推荐
在使用 XStream 进行对象到 XML 的转换时,我们首先需要创建一个 `XStream` 实例。通常我们会使用 `DomDriver` 或其他驱动来指定 XML 解析器。以下是一个简单的示例: ```java import ...
### XStream使用方法总结——对象转换 XStream是一款强大的Java库,主要用于实现Java对象与XML文档之间的相互转换。本文将详细介绍XStream的基本用法、配置选项以及如何利用它来进行对象到XML的序列化和反序列化...
下面我们将详细探讨`XStream`的使用方法和特性。 首先,创建`XStream`对象是通过`new XStream()`完成的。双向转换是`XStream`的核心功能,`toXML()`方法用于将Java对象转换为XML字符串,而`fromXML()`方法则相反,...
为了演示 XStream 的基本用法,可以创建一个新的 Java 项目。首先,定义两个简单的 Java 类:`Person` 和 `PhoneNumber`。`Person` 类包含姓名和电话号码属性,而 `PhoneNumber` 类则表示一个电话号码。如下所示: ...
### Xstream使用说明 #### 一、Xstream简介 ...以上介绍了Xstream的基本使用方法以及一些高级特性。Xstream的强大之处不仅在于其简单易用,还在于其灵活性和扩展性,能够适应各种复杂的序列化需求。
XStream-1.4.2可能是一个稳定且广泛使用的版本,对于那些需要处理XML与Java对象之间转换的项目来说,它是一个可靠的选择。 标签"xstream.jar"明确了这是一个Java档案(JAR)文件,通常包含Java类、资源和其他相关...
XStream 用法详解 XML 转换为 java 实体类 所需要的 xstream-1.4.3-sources.jar jar包 具体实现请参考 http://blog.csdn.net/morning99/article/details/28875159
XStream的核心在于`toXML()`方法,它可以将任何Java对象转换成XML字符串。例如,如果你有一个简单的User类,包含name和age属性,你可以这样转换: ```java User user = new User("Alice", 25); XStream xstream...
《XStream的高级用法与自定义输出结构详解》 XStream是一款强大的Java库,用于将Java对象序列化为XML,以及将XML反序列化回Java对象。它以其简洁的API和灵活的配置赢得了广大开发者喜爱。在日常开发中,我们不仅...
XStream 是一个 Java 库,它能够将 Java 对象序列化为 XML,同时也能将 XML 反序列化回对应的 Java 对象。这个功能在数据存储、网络...学习并理解 XStream 的用法,可以帮助你在 Java 开发中更加高效地处理 XML 数据。
在本文中,我们将深入探讨XStream的使用方法,包括它的核心概念、配置、安全性和性能优化。 **1. 序列化到XML** XStream的核心功能是能够将Java对象转换成XML。首先,我们需要导入XStream库,并创建一个XStream...
首先创建一个Java对象,然后使用XStream实例的`toXML()`方法将其转换为XML字符串。 ```java import com.thoughtworks.xstream.XStream; public class User { private String name; private int age; // 构造器...
赠送jar包:xstream-1.4.11.jar;...使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
因此,应使用`XStream.setupDefaultSecurity()`方法来限制可以反序列化的类,防止恶意攻击。 - **命名空间支持**:XStream支持XML命名空间,使得在XML中组织元素更加有序,尤其是在处理包含多个XML schema的大型...
在`beanToXml()` 方法中,同样需要初始化xStream实例,然后使用`toXML()` 方法将Bean对象转换为XML字符串: ```java public String beanToXml(YourBeanClass bean) { XStream xstream = new XStream(new DomDriver...
XML(Extensible Markup Language)是一种用于标记数据的语言,广泛...了解不同的解析方法,以及如何使用XStream,将有助于提升开发效率和代码质量。通过实际操作,你可以更好地掌握这些知识,并将其应用于实际项目中。
在本学习文档中,我们将深入探讨 XStream 的核心概念、用法以及如何在实际项目中应用。 一、XStream 简介 XStream 能够将复杂的 Java 对象结构转换成易于读写的 XML 格式,同时也能将 XML 文档还原为对应的 Java ...
首先,我们需要了解XStream的基本用法。XStream的核心是`XStream`类,它提供了`toXML()`方法用于将Java对象转换为XML字符串,以及`fromXML()`方法用于反向操作。要使用XStream,你需要先创建一个`XStream`实例,然后...
在实际使用中,`xstream-1.3.1.jar`文件是XStream的库文件,包含了所有必要的类和方法,可以直接导入到Java项目中使用。为了更好地理解和利用XStream,开发者应深入研究其API文档,学习如何配置转换器,处理嵌套的...