一、简单介绍

XStream是thoughtworks开发的开源框架,用于实现XML数据于Java对象、Json数据的转换。它不需要schema或其他的mapping文件就可以进行java对象和xml文件之间的转换,API调用起来非常方便,并且扩展功能强大。

1XStream的特点

a)灵活易用:在更高的层次上提供了简单、灵活、易用的统一接口,用户无需了解项目的底层细节

b)无需映射:大多数对象都可以在无需映射的情况下进行序列化与反序列化的操作

c)高速稳定:设计时力求达到的最重要的指标是解析速度快、占用内存少,以使之能够适用于大的对象处理或是对信息吞吐量要求高的系统

d)清晰易懂:项目采用reflection机制得到无冗余信息的XML文件。所生成的XML文件较本地Java序列化产物更简洁,格式更清晰,更便于用户阅读

e)无需修改:完全序列化包括private和final类型在内的全部内部字段。支持非公有类和内部类,类可以没有缺省的构造函数。

f)易于集成:通过实现特定的接口,XStream可以直接与其它任何树型结构进行序列化与反序列化操作(而不仅仅是XML格式)

g)灵活转换:转换策略是可以定制的,允许用户自定义特殊类型的对象如何以XML格式存储。

h)错误处理:由于XML文本不合法而造成异常时,会提供详细地诊断信息帮助处理问题。

2,应用场合

a)数据对象的持久化

b)数据交换

c)配置文件

3,架构分析

a)Converters(转换器)

当XStream遇到需要转换的对象时,它会委派给合适的转换器实现,XStream为通用类型提供了多种转换器实现,包括基本数据类型、String、Collections、Arrays、null、Date,等等。

XStream提供了缺省的转换器,当需要转换的数据对象没有匹配的转换器时会使用。是通过反射机制自动完成对对象内所有字段的映射。

b)IO(输入/输出)

XStream是通过接口HierarchicalStramWriter和HierarchialStreamReader从底层XML数据中抽象而来的,上面的接口分别用于序列化和反序列化操作。

该特性使得XStream可以直接使用XML解析类从数据流中读取数据,或者是直接从已经存在的结构中提取数据(比如DOM)。如果XStream所操作的 XML数据已经部分被其它XML解析类处理过了(比如SOAP类的实例),这样就可以避免在我们这一层的再次解析操作。

c)Context(上下文引用)

在XStream序列化或反序列化对象时,它会创建两个类MarshallingContext和UnmarshallingContext,由它们来处理数据,以及委派合适的转换器。

XStream提供了三对上下文的缺省实现,它们之间有着细微的差别。缺省值可以通过方法XStream.setMode()来改变,需要传递下面参数中的一个:

i)XStream.XPATH_REFERENCES,(缺省的)通过XPath引用来标识重复的引用。这样产生的XML具有最小的混乱性。

ii)XStream.ID_REFERENCES,使用ID引用来标识重复的引用。在一些场合,比如使用手写XML时,这样将会更易于操作

iii)XStream.NO_REFERENCES,这种情况将失去对图形对象的支持,仅把对象看作为树型结构。重复的引用被视作两个不同的对象,循环引用会导致异常产生。相对于上面两种模式,这种模式速度会更快,占用内存会更

d)Facade(统一入口)

主要类XStream用作所有项目的入口点。它将上面所提及的重要组件集成在一起,提供更简单易用的API操作。

二、资源网址

项目主页:

http://xstream.codehaus.org/

在线帮助文档:http://xstream.codehaus.org/javadoc/index.html

lib和源码下载:http://xstream.codehaus.org/download.html

三、注意事项:

1,XStream将Java对象序列化为XML数据时,不关心属性字段是否是final、private类型,也不关心是否有对应的get/set方法,更不关心你是否有一个默认的无参构造方法。

2,项目的classpath中应该有3个包:xstream-[版本].jar,xpp3-[版本].jar,xmlpull-[版本].jar。

四、使用入门示例及介绍

1,示例代码

  1. import com.thoughtworks.xstream.XStream;
  2. import com.thoughtworks.xstream.io.xml.DomDriver;
  3. import com.thoughtworks.xstream.io.xml.StaxDriver;
  4. public class XStreamTest {
  5. public static void main(String[] args) {
  6. Person p = new Person();
  7. p.sex = new StringBuffer("未知");
  8. p.set("如花");
  9. p.age = 70;
  10. System.out.println("转换之前的Person对象p="+p);
  11. //这样创建XStream实例时,上面那3个jar包必须都有
  12. //    XStream xstream = new XStream();
  13. //这里不需要XPP3库了,而是使用标准的JAXP DOM解析XML
  14. //    XStream xstream = new XStream(new DomDriver());
  15. //这里不需要XPP3库了但是需要你使用java 6
  16. XStream xstream = new XStream(new StaxDriver());
  17. String xml = xstream.toXML(p);
  18. System.out.println("转换生成XML字符串=="+xml);
  19. Person p2 = (Person) xstream.fromXML(xml);
  20. System.out.println("转换之后的Person对象p2="+p2);
  21. }
  22. }
  23. class Person{
  24. private String name;
  25. int age;
  26. public StringBuffer sex;
  27. public void set(String name){
  28. this.name = name;
  29. }
  30. public String toString(){
  31. return "{name="+name+";age="+age+";sex="+sex+"}";
  32. }
  33. }

运行结果:

转换之前的Person对象p={name=如花;age=70;sex=未知}

转换生成XML字符串==<?xml version="1.0" ?><cn.tjpu.zhw.xml.Person><name>如花</name><age>70</age><sex>未知</sex></cn.tjpu.zhw.xml.Person>

转换之后的Person对象p2={name=如花;age=70;sex=未知}

2,创建XStream对象

a)无参构造函数,默认使用XPP3包

  1. //这样创建XStream实例时,上面那3个jar包必须都有
  2. XStream xstream = new XStream();

b)有参构造函数,使用标准的JAXP DOM

  1. //这里不需要XPP3和xmlpull库了,而是使用标准的JAXP DOM解析XML
  2. XStream xstream = new XStream(new DomDriver());

c)有参构造函数,使用StAX解析XML

  1. //这里不需要XPP3库了但是需要你使用java 6
  2. XStream xstream = new XStream(new StaxDriver());

3,将Java对象转换成为XML字符串

String xml = xstream.toXML(p);

结果是:

  1. <?xml version="1.0" ?>
  2. <cn.tjpu.zhw.xml.Person>
  3. <name>如花</name>
  4. <age>70</age>
  5. <sex>未知</sex>
  6. </cn.tjpu.zhw.xml.Person>

4,将XML转换成为Java对象

Person p2 = (Person) xstream.fromXML(xml);

参考文章:http://www.doc88.com/p-091909836812.html

使用XStream是实现XML与Java对象的转换(1)--简介及入门示例的更多相关文章

  1. 使用XStream是实现XML与Java对象的转换(6)--持久化

    九.持久化 在第八节的示例中,当我们操作一组对象时,我们可以指定Writer.OutputStream来写出序列化后的XML数据,我们还可以指定Reader.InputStream来读取序列化后的XM ...

  2. 使用XStream是实现XML与Java对象的转换(4)--转换器

    七.转换器(Converter) 我们程序中的POJO是千变万化的,而且需求也是千奇百怪的,所以XStream中的内置的转换器的功能不一定能够满足我们的要求,所以我们就需要自己构建转换器. 1,一个基 ...

  3. 使用XStream是实现XML与Java对象的转换(3)--注解

    六.使用注解(Annotation) 总是使用XStream对象的别名方法和注册转换器,会让人感到非常的乏味,又会产生很多重复性代码,于是我们可以使用注解的方式来配置要序列化的POJO对象. 1,最基 ...

  4. 使用XStream是实现XML与Java对象的转换(5)--Object Stream

    八,Object Stream 之前的例子我们都是直接输出Xml成为String类型或者从String中获得并解析Xml,现在我们要处理输入流和输出流! 1,输出流(ObjectOutputStrea ...

  5. 使用XStream是实现XML与Java对象的转换(2)--别名

    五.使用别名(Alias) 首先,有这样一段Java代码: import java.util.ArrayList; import java.util.List; import com.thoughtw ...

  6. 不规矩的xml与JAVA对象互相转换的小技巧-使用Marshaller

    摘要:将XML文档与JAVA对象互转是很常见的需求,如果XML定义很规整这很好实现.然而在现实中“不规矩”的XML可能更常见,Marshaller便无能为力了吗?下面是一个小技巧,调整一下思维便能重用 ...

  7. XStream轻松转换xml和java对象

    首先引入所需的jar: xstream-1.4.9.xpp3_min-1.1.4c.dom4j-1.6.1, 或用maven管理jar包时在pom.xml中添加: <!-- https://mv ...

  8. xml-mapping xml 与 java 对象转换映射框架,像 XStream 一样优雅地读写xml

    xml xml 是 java 实现的 xml 框架. 希望以最优雅的方式进行 xml 和 java 之间的转换处理,一行代码搞定一切. 特点 对象的和 xml 的互相映射 支持注解 @Alias 指定 ...

  9. XML 和 java对象相互转换

    XML 和 java对象相互转换 博客分类: XML 和 JSON   下面使用的是JDK自带的类,没有引用任何第三方jar包. Unmarshaller 类使客户端应用程序能够将 XML 数据转换为 ...

随机推荐

  1. UNIX环境高级编程——创建孤儿进程

    /* 创建孤儿进程 父进程终止后,向子进程发送挂断信号,又接着发送继续信号. */ #include <stdio.h> #include <stdlib.h> #includ ...

  2. 海量数据处理算法(top K问题)

    举例 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M.返回频数最高的100个词. 思路 首先把文件分开 针对每个文件hash遍历,统计每个词语的频率 使用堆进 ...

  3. Java开发各层对象含义 PO,VO,DAO,BO,POJO

    java的几种对象(PO,VO,DAO,BO,POJO)解释     一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中 ...

  4. iOS中 Realm错误总结整理 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博! 一.错误信息:Attempting to modify object outside of a write tra ...

  5. UNIX网络编程——SOCKET API和TCP STATE的对应关系_三次握手_四次挥手及TCP延迟确认

    在socket系统调用中,如何完成三次握手和四次挥手: SOCK_DGRAM即UDP中的connect操作知识在内核中注册对方机器的IP和PORT信息,并没有建立连接的过程,即没有发包,close也不 ...

  6. Docker教程:dokcer machine的概念和安装

    http://blog.csdn.net/pipisorry/article/details/50920982 Docker machine介绍 做为Docker容器集群管理三剑客之一的Docker ...

  7. Linux Debugging(六): 动态库注入、ltrace、strace、Valgrind

    实际上,Linux的调试方法非常多,针对不同的问题,不同的场景,不同的应用,都有不同的方法.很难去概括.本篇文章主要涉及本专栏还没有涵盖,但是的确有很重要的方法.本文主要包括动态库注入调试:使用ltr ...

  8. Spark1.4从HDFS读取文件运行Java语言WordCounts并将结果保存至HDFS

    本次实验相关信息如下: 操作系统:Ubuntu 14 Hadoop版本:2.4.0 Spark版本:1.4.0 运行前提是Hadoop与Spark均已正确安装配置 2.在Linux中生成一个文件tes ...

  9. 【一天一道LeetCode】#76. Minimum Window Substring

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  10. (NO.00001)iOS游戏SpeedBoy Lite成形记(七)

    因为我们之前在GameScene中建立的2个数组,分别为player和label的数组.大家可以注意到其中每个元素是一一对应的. 知道了这层关系,我们尝试来更新matchRun方法: CCAction ...