`
yimeng528
  • 浏览: 183848 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

XStream实用指南

阅读更多

XStream实用指南

       —— XuSweeter @ 2011-04-17

       XStreamthoughtworks公司发布的一个简单的Java类库,用于将JavaBean序列化为XML,并且能够将XML文件反向转换为JavaBean。本文根据XStream1.3.1版本对其基本使用做简单介绍,参考资料来源于官方教程和API

壹、快速上手

       通过一个简单的示例来演示XStream的基本使用,你会发现使用XStreamJavaBeanXML之间的转换会有多么的便捷。

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-[版本].jarxpp3-[版本].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中经常会碰到对象引用的情况,如定义了一个对象AB对象会引用对象A。那么在对象引用发生时,在序列化的XML中该如何表述呢?

       XStreamXML中能够通过相对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 开发指南 xml json 转换 XStream对JSON、XML的都支持,它可以对JSON或XML的完美转换。

    最齐全的xstream1.4.8.jar

    最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar ...

    xstream-1.4.15.jar

    XStream 反序列化漏洞(CVE-2020-26258 & 26259),修复jar包 xstream-1.4.15.jar Xstream 是 Java 类库,用来将对象序列化成 XML (JSON) 或反序列化为对象。XStream 是一款开源软件,允许在 BSD 许可证的许可下分发...

    xstream最新版 - xstream-1.4.18.jar

    xstream最新版jar包

    xstream-1.4.19.jar

    xstream-1.4.19.jar

    xstream-1.4.11-API文档-中文版.zip

    赠送jar包:xstream-1.4.11.jar; 赠送原API文档:xstream-1.4.11-javadoc.jar; 赠送源代码:xstream-1.4.11-sources.jar; 赠送Maven依赖信息文件:xstream-1.4.11.pom; 包含翻译后的API文档:xstream-1.4.11-...

    xstream-1.4.jar

    xstream jar包,java对象转xml以及xml转java对象,操作很简单。

    XStream XML与Json转换

    XStream在运行时使用Java反射机制对要进行序列化的对象树的结构进行探索,并不需要对对象作出修改。XStream可以序列化内部字段,包括私private和final字段,并且支持非公开类以及内部类。 在缺省情况下,XStream不...

    xstream1.22.jar

    xstream 1.2 ,xstream 1.2.2.jar xstream 1.2 ,xstream 1.2.2.jar

    XStream解析XML实例

    XStream解析XML实例

    XStream DOC

    XStream DOC

    xstream-1.4.7.jar

    xstream-1.4.7.jar XML

    xstream-1.4.2.jar

    xstream-1.4.2.jar,官网上也有,由于本人分没了,希望有分的同志给点分。如果你也每份,请上官网下,地址:http://xstream.codehaus.org/download.html

    xstream-1.4.5.jar

    xstream xstream-1.4.5.jar

    xstream-1.4.2

    xstream-1.4.2

    解决XStream注解同名冲突

    com.thoughtworks.xstream.converters.ConversionException: No field 'null' found in class '.....(注解的类路径)' ---- Debugging information ---- message : No field 'null' found in class '.....' cause...

    xstream相关的jar包

    xstream所需要的jar包,xstream-1.4.9.jar、dom4j-1.6.1.jar、xpp3_min-1.1.4c.jar等

    xstream-1.4.4-sources.jar

    XStream 是一个开源项目,一套简单实用的类库,用于序列化对象与 XML 对象之间的相互转换。将 XML 文件内容解析为一个对象或将一个对象序列化为 XML 文件。

    Java用xStream拼接xml

    webService接口对接时,需要传递一个xml内容。用xStream拼接xml

    xstream-1.4.7-API文档-中文版.zip

    赠送jar包:xstream-1.4.7.jar; 赠送原API文档:xstream-1.4.7-javadoc.jar; 赠送源代码:xstream-1.4.7-sources.jar; 赠送Maven依赖信息文件:xstream-1.4.7.pom; 包含翻译后的API文档:xstream-1.4.7-javadoc-...

Global site tag (gtag.js) - Google Analytics