`

Xstream简介

    博客分类:
  • java
阅读更多

项目简介

开源项目XStream是一套简单实用的类库,用于序列化对象与XML对象之间的相互转换。本文以XStream 1.1.2版进行说明,它具有以下几个特点:

  1. 灵活易用:在更高的层次上提供了简单、灵活、易用的统一接口,用户无需了解项目的底层细节
  2. 无需映射:大多数对象都可以在无需映射的情况下进行序列化与反序列化的操作
  3. 高速稳定:设计时力求达到的最重要的指标是解析速度快、占用内存少,以使之能够适用于大的对象处理或是对信息吞吐量要求高的系统
  4. 清晰易懂:项目采用reflection机制得到无冗余信息的XML文件。所生成的XML文件较本地Java序列化产物更简洁,格式更清晰,更便于用户阅读
  5. 无需修改:完全序列化包括private和final类型在内的全部内部字段。支持非公有类和内部类,类可以没有缺省的构造函数
  6. 易于集成:通过实现特定的接口,XStream可以直接与其它任何树型结构进行序列化与反序列化操作(而不仅仅是XML格式)
  7. 灵活转换:转换策略是可以定制的,允许用户自定义特殊类型的对象如何以XML格式存储。
  8. 错误处理:由于XML资料不合法而造成异常时,会提供详细地诊断信息帮助处理问题。


典型的应用场合

XStream主要应用于以下场合:

  • 数据对象的持久化
  • 数据交换
  • 配置文件


XStream系统架构分析

XStream的架构主要由四部分组成:

    Converters(转换器)
   
    当XStream遇到需要轮换的对象时,它会委派给合适的转换器实现,XStream为通用类型提供了多种转换器实现,包括基本数据类型、String、Collections、Arrays、null、Date,等等。
   
    XStream提供了缺省的转换器,当需要转换的数据对象没有匹配的转换器时会使用。是通过反射机制自动完成对对象内所有字段的映射。

   

    系统提供2种转换器,Converter、SingleConverter;注册转换器也有两种方式:registerConverter和registerLocalConverter(针对指定类型下属性对转换)


    IO(输入/输出)
   
    XStream是通过接口HierarchicalStramWriter和HierarchialStreamReader从底层XML数据中抽象而来的,上面的接口分别用于序列化和反序列化操作。
   
    该 特性使得XStream可以直接使用XML解析类从数据流中读取数据,或者是直接从已经存在的结构中提取数据(比如DOM)。如果XStream所操作的 XML数据已经部分被其它XML解析类处理过了(比如SOAP类的实例),这样就可以避免在我们这一层的再次解析操作。

    Context(上下文引用)

    在XStream序列化或反序列化对象时,它会创建两个类MarshallingContext和UnmarshallingContext,由它们来处理数据,以及委派合适的转换器。
   
    XStream提供了三对上下文的缺省实现,它们之间有着细微的差别。缺省值可以通过方法XStream.setMode()来改变,需要传递下面参数中的一个:
   
    XStream.XPATH_RELATIVE_REFERENCES
    (缺省的)通过XPath引用来标识重复的引用,使用相对路径表示。

   
    XStream.XPATH_ABSOLUTE_REFERENCES
    通过XPath引用来标识重复的引用,使用绝对路径表示。

   
    XStream.ID_REFERENCES
    使用ID引用来标识重复的引用。在一些场合,比如使用手写XML时,这样将会更易于操作
   
    XStream.NO_REFERENCES
    这种情况将失去对图形对象的支持,仅把对象看作为树型结构。重复的引用被视作两个不同的对象,循环引用会导致异常产生。相对于上面两种模式,这种模式速度会更快,占用内存会更
   
    Facade(统一入口)
    主要类XStream用作所有项目的入口点。它将上面所提及的重要组件集成在一起,提供更简单易用的API操作。

实例讲解

下面我们通过一个简单的例子来了解XStream是如何工作的。
创建需要序列化的对象类
/**个人信息类*/
public class Person
{
/**
* 构造函数
  * @param fn 名称前部分
  * @param ln名称后部分
  * @param faxn 传真号码
  * @param mobilen 移动电话
  */
  public Person(String fn, String ln, PhoneNumber faxn, PhoneNumber mobilen)
  {
    this.firstName = fn;
    this.lastName = ln;
    this.faxNumber = faxn;
    this.mobileNumber = mobilen;
  }

/**
* 构造函数
  * @param fn 名称前部分
  * @param ln名称后部分
  */
  public Person(String fn, String ln)
  {
    this.firstName = fn;
    this.lastName = ln;
  }

  private String firstName;

  private String lastName;

  private PhoneNumber faxNumber;

  private PhoneNumber mobileNumber;

  /**
  * @return Returns the faxNumber.
  */
  public PhoneNumber getFaxNumber()
  {
    return faxNumber;
  }

  /**
  * @param faxNumber
  * The faxNumber to set.
  */
  public void setFaxNumber(PhoneNumber faxNumber)
  {
    this.faxNumber = faxNumber;
  }

  /**
  * @return Returns the firstName.
  */
  public String getFirstName()
  {
    return firstName;
  }

  /**
  * @param firstName
  * The firstName to set.
  */
  public void setFirstName(String firstName)
  {
    this.firstName = firstName;
  }

  /**
  * @return Returns the lastName.
  */
  public String getLastName()
  {
    return lastName;
  }

  /**
  * @param lastName
  * The lastName to set.
  */
  public void setLastName(String lastName)
  {
    this.lastName = lastName;
  }

  /**
  * @return Returns the mobileNumber.
  */
  public PhoneNumber getMobileNumber()
  {
    return mobileNumber;
  }

  /**
  * @param mobileNumber
  * The mobileNumber to set.
  */
  public void setMobileNumber(PhoneNumber mobileNumber)
  {
    this.mobileNumber = mobileNumber;
  }
}

/**电话号码信息类*/
public class PhoneNumber
{
  private int phoneId;

  private String phoneNumber;

/**
* 构造函数
  * @param phoneId ID号码
  * @param phoneNumber 电话号码
  */
  public PhoneNumber(int phoneId, String phoneNumber)
  {
    super();
    this.phoneId = phoneId;
    this.phoneNumber = phoneNumber;
  }

  /**
  * @return Returns the phoneNumber.
  */
  public String getPhoneNumber()
  {
    return phoneNumber;
  }

  /**
  * @param phoneNumber
  * The phoneNumber to set.
  */
  public void setPhoneNumber(String phoneNumber)
  {
    this.phoneNumber = phoneNumber;
}

  /**
  * @return Returns the phoneId.
  */
  public int getPhoneId()
  {
    return phoneId;
  }

  /**
  * @param phoneId
  * The phoneId to set.
  */
  public void setPhoneId(int phoneId)
  {
    this.phoneId = phoneId;
  }
}

这 里定义的属性都为private,XStream没有强制规定属性的可见性,默认情况下所有属性都会进行转换;虽然XStream不强制要求你必须要有 setter和getter方法,也不要求你要有一个默认的类构造方法,但是在实际应用时,这些还是必须的,因为你在程序中需要为对象设置属性,需要构造 对象,如果没有这些方法程序是不能编译通过的。

初始化XStream类

使用以下的语句进行初始化操作:

XStream xstream = new XStream();

默认情况下,XStream会采用Xpp3库,XPP3是一种运行效率非常高的XML全解析实现。如果你不想依靠Xpp3库的话,也可以使用一个标准的JAXP DOM解析器,可以采用以下语句进行初始化:

//不使用XPP3库
XStream xstream = new XStream(new DomDriver());

此xstream实例,为线程安全的,可以供多个线程进行调用,共享使用。参考com.thoughtworks.xstream.io.xml包,会发现系统提供了多种标识解析器供我们选择,包括,DomDriver、JDomDriver、StaxDriver等等。

注册需要转换的类的别名

现在,为了使XStream输出的XML文件更简练,我们要为需要转换的用户类设置别名,这些明会在转换过程中用于结点设置,注册别名使用以下的语句:

xstream.alias(“person”, Person.class);
xstream.alias(“phonenumber”, PhoneNumber.class);

当然,这一步不是必须的,如果不进行注册的话,XStream默认会在转换时,将用户类的全限定名称加入到XML文件中,如com.test.Person,如果在数据量较大的时候,生成的XML文件会增大不少。

将对象序列化为XML文档

    到了这一步,我们就可以将一个Java对象序列化为XML文档了,先声明一个Person对象,然后为该对象设置一个手机号码,一个传真号码,使用下面的语句:

//生成Person对象,并注册属性
Person joe = new Person("Bill", "Gates");
joe.setFaxNumber(new PhoneNumber(101, "83501194"));
joe.setMobileNumber(new PhoneNumber(102, "13686447788"));

    下面就是将生成的对象序列化,我们需要做的只是简单的使用下面的一个语句就可以:

String xmls = xstream.toXML(joe);

    从结果我们可以看出,生成的XML文件非常简洁,除了必要的结点外,没有一丝多余的信息存在。参考下面的生成结果:

<person>
<firstName>Bill</firstName>
<lastName>Gates</lastName>
<faxNumber>
  <phoneId>101</phoneId>
  <phoneNumber>83501194</phoneNumber>
</faxNumber>
<mobileNumber>
  <phoneId>102</phoneId>
  <phoneNumber>13686447788</phoneNumber>
</mobileNumber>
</person>

从XML文件反序列化成对象

    从一个XML文件反序列化出一个对象同样简单,一起来看下面的代码:

Person newJoe = (Person)xstream.fromXML(xmls);

结束语

    通过上面的实例,我们可以看出,使用XStream来处理对象的序列化和反序列化很简单,只需要几行代码即可,而且该项目对标识的XML解析器有很好的支 持,最重要的是生成的XML很“干净”,没有过多的冗余信息,该项目还在持续进行中,让我们一起来关注它吧!

 

分享到:
评论

相关推荐

    Java用xStream拼接xml

    **xStream简介** xStream是一个开源的Java库,由Johannes Link创建。它提供了简洁、直观的API来处理XML,使得开发者可以轻松地在Java对象和XML之间进行转换。xStream的核心功能是基于对象关系映射(ORM)的概念,它...

    xstream学习文档及实例

    一、XStream 简介 XStream 能够将复杂的 Java 对象结构转换成易于读写的 XML 格式,同时也能将 XML 文档还原为对应的 Java 对象。这在数据持久化、网络通信和配置存储等领域有着广泛的应用。XStream 通过提供简单的...

    XStream简单应用实例

    **XStream简介** XStream是一款强大的Java库,用于将Java对象序列化为XML,反之亦然。它由Joe Walnes创建,提供了一种简洁而直观的方式来处理对象与XML之间的转换。XStream的核心理念是通过简单的API,使得XML绑定...

    xml解析及使用XStream实现javaBean与xml之间的转换

    2. **XStream简介** XStream是Java中一个强大的库,用于将Java对象序列化为XML,反之亦然。它提供了简单直观的API,使得JavaBean与XML之间的转换变得非常容易。 3. **XStream的使用步骤** - 引入依赖:在项目中...

    xstream教程资料.rar

    一、XStream简介 XStream由Johannes Link创建,它通过简单的API提供了高效的序列化和反序列化功能。XStream的亮点在于其自动映射Java对象到XML的能力,使得XML结构与Java对象的字段一一对应,无需编写复杂的转换代码...

    XStream解析各种数据格式

    #### 一、XStream简介 XStream 是一个简单高效的 Java 库,用于将 Java 对象序列化为 XML 文档,同时也支持从 XML 文档反序列化为 Java 对象。它提供了简洁的 API 来简化序列化过程,使开发者能够轻松地处理对象与 ...

    XStream解析XML实例

    XStream简介** XStream是一个开源库,由Joe Walnes创建,它提供了Java对象到XML和XML到Java对象的直接映射。它的主要优点是其简洁的API和易于理解的输出。XStream的核心理念是,如果你能打印一个对象,那么也应该能...

    使用XStream操作xml教程

    一、XStream简介 XStream是一个开源库,由Johannes Link开发,它允许开发者以一种声明性方式将Java对象序列化为XML,然后又可以从XML还原回对象。XStream的核心理念是通过简单的API,减少XML处理的复杂性。它提供了...

    Xstream使用说明

    #### 一、Xstream简介 Xstream是一种对象XML映射(Object/XML Mapping)技术,主要用于处理XML文件序列化的工作。通过Xstream可以轻松地将Java对象序列化为XML文档,或者将XML文档反序列化为Java对象。与传统的XML...

    利用XStream读写xml文件

    ### XStream简介与应用 XStream是一款开源的Java库,用于简化XML文件的序列化与反序列化过程。它的设计理念是将XML数据映射到Java对象模型,反之亦然,而无需复杂的配置或显式的映射规则。XStream支持广泛的Java...

    xstream-1.4.4

    一、XStream 简介 1. 序列化与反序列化:XStream 提供了两个核心方法 `toXML()` 和 `fromXML()`,分别用于将 Java 对象转换成 XML 字符串和从 XML 字符串还原 Java 对象。这种转换是基于类的结构自动完成的,无需...

    xstream 的高级用法,自定义输出结构

    ### 一、XStream简介 XStream的核心理念是通过简单的API将Java对象与XML进行映射。它的核心类`XStream`提供了`toXML()`和`fromXML()`方法,分别用于对象到XML的转换和XML到对象的还原。此外,XStream支持类型安全的...

    Xstream生成和解析xml.rar

    **一、Xstream简介** Xstream是Java社区中的一款开源库,由Johannes Link创建,它的设计目标是使XML序列化和反序列化变得简单直观。Xstream的核心理念是通过反射机制自动处理Java对象到XML的转换,同时支持自定义...

    xstream-1.3.1.jar.zip

    1. **XStream简介** XStream由Johannes Brodbeck开发,它的设计目标是提供一个易于使用且高效的XML序列化框架。它通过简单的API,使得XML和Java对象之间可以进行透明的转换。XStream不仅支持基本数据类型,还能够...

    我对xstream对xml的操作的一些记录,仅够参考!

    一、XStream简介 XStream由Johannes Link创建,是一个基于反射的库,它提供了简单且直观的方式来处理对象与XML之间的转换。它的核心优势在于其简洁的API设计,使得XML序列化和反序列化变得异常容易,尤其对于那些不...

    xStream_two_item

    1. **xStream简介**:解释xStream是什么,它的主要功能,以及为什么在Java开发中会使用它。 2. **安装和配置**:如何在Eclipse项目中添加xStream库,包括导入Maven或Gradle依赖。 3. **基本使用**:展示如何创建...

    XStream笔计rar.rar

    一、XStream简介 XStream由Joe Walnes开发,最初设计用于简化Java对象到XML的转换,同时提供反序列化功能,以便将XML数据恢复为原始对象。它通过使用Java反射机制来实现这一目标,无需手动编写XML映射代码。XStream...

    应用源码之Xstream(解决xml和对象转换问题).zip

    1. **Xstream简介** Xstream库由Joe Walnes创建,它提供了直观且简洁的方式来映射Java对象到XML,反之亦然。它的核心思想是通过简单的注解或者类路径来定义对象和XML之间的映射关系,避免了复杂的DOM或SAX解析器的...

    XStream使用方法总结-对象-转换.txt

    #### 一、XStream简介 XStream是一种简单高效的工具类库,用于实现Java对象与XML数据格式之间的转换。它通过反射机制来读取对象的信息,并将其转化为XML格式,反之亦然。XStream提供了丰富的API接口,使得开发者...

Global site tag (gtag.js) - Google Analytics