`
zhangzuanqian
  • 浏览: 270934 次
  • 来自: ...
社区版块
存档分类
最新评论

XStream 学习笔记

    博客分类:
  • java
阅读更多

转载:http://www.blogjava.net/zlkn2005/archive/2005/12/16/24240.html

XStream

 

使用XStream的初衷

 

研究和使用XStream的原因是我在项目中的一个预研。在项目中需要应用到对XML文件的管理和配置,因此需要一个能够将对象保存为XML的工具库,在这里有多种方法实现,我也研究并进行了比对,比如与Zeus工具的比对,与Java自身的XML工具库的比对等。在这里,我就描述下我的XStream学习过程和研究结果。

 

XStream简单介绍

 

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

XStream可以用于JDK1.3以上的版本使用,我是在JDK1.5下使用它的。

XStream的相关信息可以到http://xstream.codehaus.org/下查看,它有专门的JavaDoc,可以方便的阅读Xstream的函数及方法。

XStream中主要的类为XStream,它用于序列化对象与XML 对象之间的相互转换。简单的使用它就可以解决很多问题。

XStream中主要的方法也是我用的比较多的是fromXML()toXML()

fromXML用于从XML中将对象解析出来。

toXML用于将对象序列化为XML文件。

XStream中我还使用HierarchicalStreamWriterHierarchicalStreamReadercreateObjectInputStream()createObjectOutputStream(),主要是用于对象的输入输出。

下面我们来研究下XStream的工作方式。

 

XStream的实例——将一个序列化对象转化为XML对象。

 

一,创建XStream对象。

XStream xstream=new XStream();

用默认构造器构造了一个名为xstreamXStream的对象。默认构造器所使用XML解析库为Xpp3库,XPP3是一种运行效率非常高的XML全解析实现。

 

二,创建需要序列化的对象。

比如这个类就叫PrintUnit

构造也比较简单,一个简单的JavaBean

       public class PrintUnit

       {

              Private String a;

              Private String b;

              Private String c;

             

              Public PrintUnit(){}

             

              Public setA(String a)

              {

                     this.a=a;

              }

 

              Public getA()

              {

                     return a;

              }

 

              Public setB(String b)

              {

                     this.b=b;

              }

 

              Public getB()

              {

                     return b;

              }

 

              Public setC(String c)

              {

                     This.c=c;

              }

 

              Public getC()

              {

                     Return c;

              }

       }

 

在例子中使用这个JavaBean

创建并初始化PrintUnit

PrintUnit pu=new PrintUnit();

pu.setA("A11");

pu.setB("B22");

pu.setC("C33");

 

三,创建Writer

创建一个输出流,至于怎么输出我发现可以使用多种方法,其实原理是一样的。

在这里就不得不提到HierarchicalStreamWriter,HierarchicalStreamWriter是一个接口,从字面上意思来说它是有等级的输入流。同样在XStream中也有不少这个接口的实现类用于输出。我现在所用过的有CompactWriterPrettyPrintWriter2个。

我是这样做的:

String str="stream.xml"; //本目录下的一个名为streamXML文件

PrintWriter pw=new PrintWriter(str);//创建一个PrintWriter对象,用于输出。

之后选用一个HierarchicalStreamWriter的实现类来创建输出。

选用CompactWriter创建:

CompactWriter cw=new CompactWriter(pw);

选用PrettyPrintWriter创建:

PrettyPrintWriter ppw=new PrettyPrintWriter(pw);

两者所使用的方法都是很简单的。

CompactWriterPrettyPrintWriter的区别在于,以CompactWriter方法输出的为连续的没有分隔的XML文件,而用PrettyPrintWriter方法输出的为有分隔有一定格式的XML文件。

CompactWriter方式生成的XML文件:

 

<object-stream><PrintUnit><a>A11</a><b>B22</b><c>C33</c></PrintUnit></object-stream>

 

PrettyPrintWriter方式生成的XML文件:

       <object-stream>

             <PrintUnit>

                  <a>A11</a>

                  <b>B22</b>

                  <c>C33</c>

             </PrintUnit>

       </object-stream>

 

       我想大家能很容易的分辨出它们的差异。

 

       四,输出操作      

以上步骤完成后就可以做输出操作了,XStream的输出方式有多种:toXML方式,ObjectOutputStream方式,marshal方式以及一些我尚未发现的一些其它方式。

先说下我所使用的方式它们各自的不同点,从工作原理上说它们是相似的,但是做法各不相同。

toXML()方法,本身toXML的方法就有2种:

第一种:java.lang.String toXML(java.lang.Object obj)

将对象序列化为XML格式并保存到一个String对象中。

第二种:void toXML(java.lang.Object obj, java.io.Writer out)

将对象序列化为XML格式后以Writer输出到某个地方存储。

我所使用的是第二种方式,使用前面已经做好的Pw就可以实现输出,它其实很简单不需要再去做其它定义,只需要一个PrintWriter对象和需要序列化的Object即可。

直接调用xstream.toXML(printUnit,pw);就能输出XML文件,在这里是输出到该目录下的stream.xml中。这里的输出都是覆盖性的,不是末尾添加形式。

使用ObjectOutputStream方式,简单说它就是生成一个对象输出流。

ObjectOutputStream obj_out = xstream.createObjectOutputStream(ppw);

使用XStreamcreateObjectOutputStream方法创建一个ObjectOutputStream对象,用于XML的输出。这里使用的是PrettyPrintWriter的方式。   之后调用writerObject方法既可,使用方法与其它输出流类似。

obj_out.writeObject(pu);

obj_out.close();

使用marshal方式,其实marshal方法和toXML方法是相同的。在调用toXML方法进行输出时,在XStream内部是需要调用marshal方法的,然后它再去调用对象marshallingStrategymarshal方法。所以做toXML其实和marshal是相同的,在这里只是想更加说明它的工作方式。

 

使用 void marshal(java.lang.Object obj, HierarchicalStreamWriter writer)方法。

延续上面的例子,在这里可以这样写:xstream.marshal(pu,ppw);

 

需要注意的是,和toXML不同的是参数,一个是PrintWriter对象一个则是PrettyPrintWriter对象。因为marshal中需要

 

HierarchicalStreamWriter,而PrettyPrintWriter则是实现了HierarchicalStreamWriter接口的实现类。

 

结果和toXML是相同的。

 

五,结果:

       <object-stream>

             <PrintUnit>

                  <a>A11</a>

                  <b>B22</b>

                  <c>C33</c>

             </PrintUnit>

       </object-stream>

 

经过以上5步的操作既可将一个序列化对象转化为XML对象。

 

 

XStream的实例——将XML文件转化为一个对象

 

通过上面的一个例子不难看出XStream简便性,既然有了输出就一定会有输入。

输入方我们将会使用ObjectInputStream

与输出相同我们需要有一个XStream对象,暂且名为xstream。之后需要读取的XML文件地址目录信息。沿用上面的例子。

String inputStr="xstream.xml";

XStream xstream=new XStream();

我们需要通过对象流进行输入操作,所以需要FileReaderBufferedReader

FileReader fr=new FileReader(inputStr);

BufferedReader br=new BufferedReader(fr);

创建对象输入流

ObjectInputStream obj_input=xstream.createObjectInputStream(br);

创建对象,还是使用PrintUnit这个对象。

PrintUnit pu2;

通过ObjectInputStream中的readObject()方法将对象从XML文件中读取出来。

pu2=(PrintUnit)obj_input.readObject();

获取值:

System.out.println(pu2.getB());

控制台:

B22 

 

从整个输入的过程来看,是一个文件的读取,将其中的对象数据取出来,然后再对这个对象数据进行操作。内容也比较简单通过ObjectInputStream输入对象。

通过以上的输入输出例子,我想大家应该很容易就能理解XStream是如何实现的。

 

FomXML

 

上面使用的是以ObjectInputStream的方式进行XML与对象之间进行转换的。下面我将使用XStream中的fromXML()方法进行转换。

首先在使用fromXML我发现一个问题,它必须使用正确的解析方式或输出方式对应的输入方式才可以正常解析读取文件,这个问题有点怪,不过确实存在,当我使用前面ObjectOutputStream方式输出的XML文件,fromXML()解析读取时,它会报错。

错误信息:

Exception in thread "main" com.thoughtworks.xstream.alias.CannotResolveClassException: object$stream : object$stream

信息内容为:不能解析这个文件。我认为它和输出方式有关,因为上面例子中使用的是ObjectOutputStream,当我反过来做了一个实验后也证明了这一点。

实验大致内容:使用toXML()方法输出XML文件,使用ObjectInputStream解析,发现会在读取的时候抛出CannotResolveClassException异常。

错误信息:

Exception in thread "main" com.thoughtworks.xstream.alias.CannotResolveClassException:

a : a

       因此我认为在解析文件的时候必须先要确定这个文件是由什么方式生成的,然后在解析它,对于使用Dom,Dom4j,XPP等不同方式解析尚未尝试。以上测试是在默认的基础上实验的,默认为XPP3的解析器。

 

       使用fromXML的方法。

      

       public java.lang.Object fromXML(java.lang.String xml)

       public java.lang.Object fromXML(java.io.Reader xml)

public java.lang.Object fromXML(java.lang.String xml,java.lang.Object root)

public java.lang.Object fromXML(java.io.Reader xml,java.lang.Object root)

      

例子:

       PrintUnit puTwo=(PrintUnit)xstream.fromXML(xml);

      

这里的xml必须是使用toXML()生成出来的。对于Reader没有太多的要求。

 

 

XStreamJava.BeanXML工具的比较

 

       XStream主要作用是将序列化的对象转化为一个XML文件或将XML文件解析为一个对象。当然并非只有它可以做到,很多其它工具一样可以,在Java中存在这样两个类XMLDecoderXMLEncoder,它们是在Java.Bean包下的,它们的作用是将JavaBean转化为XML或将XML文件转化为一个Java Bean

       XMLDecoder是通过一个输入流将对象从输入流中取出并转化为一个实例的方法。它所需要的就是一个输入流及一个转化过程。

 

       XMLDecoder的实例:

 

       String fileStr=”xstream.xml”;//XML文件,在本目录下,延用上次使用文件。

       ObjectInputStream in=new ObjectInputStream(new FileInputStream(fileStr));//创建一个ObjectInputStream用于输入。

       XMLDecoder xmld=new XMLDecoder(in);//创建一个XMLDecoder对象。

       延用前面所使用PrintUnit这个Bean

       PrintUnit pu=(PrintUnit)xmld.readObject();//通过XMLDecoder中的readObject方法获得PrintUnit对象。

如果获取到了这个对象那么pu中将有它的值a=A11,b=B22,c=C33。整个过程最好放try

…catch中去,能够捕获一些如:文件不存在等异常。

       从操作方式上看XMLDecoder似乎不比XStream差多少,同样是可以通过ObjectInputStream获取XML文件中的对象。它们的差异就是解析的方式不同,XMLDecoder是使用Java自带的XML解析方式,而XStream则是可以自定义的,它可以使用多中方式进行解析。这些是我个人所发现的一些不同点。

 

       XMLEncoder是通过一个输出流将对象序列化并输出为XML文件。它所需要的是一个输出流及一个输出方式。

 

       XMLEncoder的实例:

 

       String fileStr=”xstream.xml”;//定义一个输入的目标文件。

       ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(fileStr));//创建一个对象输出流。

       XMLEncoder xmle=new XMLEncoder(out);//创建一个XMLEncoder对象。

       延用前面所使用PrintUnit这个Bean

//创建并初始化PrintUnit对象。

PrintUnit pu=new PrintUnit();

pu.setA(“AAA”);

pu.setB(“BBB”);

pu.setC(“CCC”);

 

       xmle.writeObject(pu);//使用XMLEncodewriteObject方法输出pu

       xmle.flush();//刷新

       xmle.close();//关闭输出流

 

       从上面的代码不难看出,使用XMLEncode方式将对象序列化并输出也是很方便的,简单调用writeObject方法能将普通Bean输出为XML文件。

      

       XML文件的内容:

 

�_ <?xml version="1.0" encoding="UTF-8"?>

<java version="1.5.0" class="java.beans.XMLDecoder">

 <object class="test.PrintUnit">

  <void property="a">

   <string>AAA</string>

  </void>

  <void property="b">

   <string>BBB</string>

  </void>

  <void property="c">

   <string>CCC</string>

  </void>

 </object>

w   </java>

 

       不知道是我哪里没有处理,还是实际并不是像我想象的哪么简单,使用XMLEncoder所输出的XML文件中有一定的问题,虽然它很详细,比起XStream所生成的更多,包括了XMLJava的版本看上去更像是个完整的XML文件,不过再细看它们两生成的XML格式内容,完全不同,这个我想就是它们最大的区别。这让我想到了很多内容:工作方式,解析器,转换方式等。大家有没发现在开始和结束都存在一些乱码数据,难道在XMLEncoder输出过程中或数据转换中内容已经存在“脏”数据了?还是我所使用的输出方式存在问题?哎一个又一个问题出现了。我想我需要再进一步的研究和学习才能得到答案。

       不过尽管有这个那个的问题,使用Java本身自带的XML工具还是一样很实用的,读取和输出一样可用,操作也很灵活。因此我觉得在某些场合使用特定的工具可能会更好,利用XMLEncoderXMLDecoder同样可以解决一些问题。

我的这个使用XMLDecoderXMLEncoder的序列化格式输出暂研究到这里。

 

分享到:
评论

相关推荐

    《xStream完美转换XML、JSON》学习笔记

    《xStream完美转换XML、JSON》学习笔记 在IT领域,数据交换是常见的需求,而XML和JSON作为两种广泛使用的数据格式,它们之间的转换尤为重要。xStream是一个强大的Java库,它能够轻松地将Java对象序列化为XML或反...

    JBoss ESB 学习笔记

    ### JBoss ESB 学习笔记知识点概览 #### 一、搭建ESB开发环境 - **工具准备**: - Eclipse-JEE 3.5:集成开发环境,支持Java EE标准,适合企业级应用程序开发。 - jbossesb-server-4.7:JBoss ESB的具体版本,为...

    CXF笔记

    【CXF笔记】是关于Apache CXF框架的深入学习记录,该笔记可能涵盖了CXF的基本概念、使用方法、源码解析以及与开发工具的结合应用。Apache CXF是一个开源服务框架,它允许开发者构建和部署多种Web服务。通过CXF,我们...

    CSS样式 JS特效 Java小工具 文学文档 Java插件 截图软件

    从描述中的“博文链接”我们可以推测,这可能是一份关于编程学习或经验分享的文章,其中可能涵盖了使用Java和JavaScript进行Web开发的一些技巧和实践,以及如何利用XStream库处理XML数据。 标签“源码”提示我们,...

    漫画作品与时间旅行题材.doc

    漫画作品与时间旅行题材

    基于SpringBoot框架的的在线视频教育平台的设计与实现(含完整源码+完整毕设文档+PPT+数据库文件).zip

    Spring Boot特点: 1、创建一个单独的Spring应用程序; 2、嵌入式Tomcat,无需部署WAR文件; 3、简化Maven配置; 4、自动配置Spring; 5、提供生产就绪功能,如指标,健康检查和外部配置; 6、绝对没有代码生成和XML的配置要求;第一章 绪 论 1 1.1背景及意义 1 1.2国内外研究概况 2 1.3 研究的内容 2 第二章 关键技术的研究 3 2.1 相关技术 3 2.2 Java技术 3 2.3 ECLIPSE 开发环境 4 2.4 Tomcat介绍 4 2.5 Spring Boot框架 5 第三章 系统分析 5 3.1 系统设计目标 6 3.2 系统可行性分析 6 3.3 系统功能分析和描述 7 3.4系统UML用例分析 8 3.4.1管理员用例 9 3.4.2用户用例 9 3.5系统流程分析 10 3.5.1添加信息流程 11 3.5.2操作流程 12 3.5.3删除信息流程 13 第四章 系统设计 14 4.1 系统体系结构 15 4.2 数据库设计原则 16 4.3 数据表 17 第五章 系统实现 18 5.1用户功能模块 18 5.2

    PyTorch入门指南:从零开始掌握深度学习框架.pdf

    内容概要:本文作为PyTorch的入门指南,首先介绍了PyTorch相较于TensorFlow的优势——动态计算图、自动微分和丰富API。接着讲解了环境搭建、PyTorch核心组件如张量(Tensor)、autograd模块以及神经网络的定义方式(如nn.Module),并且给出了详细的神经网络训练流程,包括前向传播、计算损失值、进行反向传播以计算梯度,最终调整权重参数。此外还简要提及了一些拓展资源以便进一步探索这个深度学习工具。 适用人群:初次接触深度学习技术的新学者和技术爱好者,有一定程序基础并希望通过PyTorch深入理解机器学习算法实现的人。 使用场景及目标:该文档有助于建立使用者对于深度学习及其具体实践有更加直观的理解,在完成本教程之后,读者应当能够在个人设备上正确部署Python环境,并依据指示独立创建自己的简易深度学习项目。 其他说明:文中所提及的所有示例均可被完整重现,同时官方提供的资料链接也可以方便有兴趣的人士对感兴趣之处继续挖掘,这不仅加深了对PyTorch本身的熟悉程度,也为未来的研究或者工程项目打下了良好的理论基础和实践经验。

    古镇美食自驾游:舌尖上的历史韵味.doc

    古镇美食自驾游:舌尖上的历史韵味

    基于人工神经网络(ANN)的高斯白噪声的系统识别 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    漫画作品与神话传说融合.doc

    漫画作品与神话传说融合

    实时电价机制下交直流混合微网优化运行方法 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    ADC推理软件AI程序

    ADC推理软件AI程序

    漫画作品与科幻元素融合.doc

    漫画作品与科幻元素融合

    【电缆】中压电缆局部放电的传输模型研究 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    基于人工神经网络的类噪声环境声音声学识别 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    多约束、多车辆VRP问题 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    基于麻雀搜索算法(SSA)优化长短期记忆神经网络参数SSA-LSTM冷、热、电负荷预测 附Python代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    java-springboot+vue景区民宿预约系统实现源码(完整前后端+mysql+说明文档+LunW+PPT).zip

    java-springboot+vue景区民宿预约系统实现源码(完整前后端+mysql+说明文档+LunW+PPT).zip

    56页-智慧园区解决方案(伟景行).pdf

    在智慧城市建设的大潮中,智慧园区作为其中的璀璨明珠,正以其独特的魅力引领着产业园区的新一轮变革。想象一下,一个集绿色、高端、智能、创新于一体的未来园区,它不仅融合了科技研发、商业居住、办公文创等多种功能,更通过深度应用信息技术,实现了从传统到智慧的华丽转身。 智慧园区通过“四化”建设——即园区运营精细化、园区体验智能化、园区服务专业化和园区设施信息化,彻底颠覆了传统园区的管理模式。在这里,基础设施的数据收集与分析让管理变得更加主动和高效,从温湿度监控到烟雾报警,从消防水箱液位监测到消防栓防盗水装置,每一处细节都彰显着智能的力量。而远程抄表、空调和变配电的智能化管控,更是在节能降耗的同时,极大地提升了园区的运维效率。更令人兴奋的是,通过智慧监控、人流统计和自动访客系统等高科技手段,园区的安全防范能力得到了质的飞跃,让每一位入驻企业和个人都能享受到“拎包入住”般的便捷与安心。 更令人瞩目的是,智慧园区还构建了集信息服务、企业服务、物业服务于一体的综合服务体系。无论是通过园区门户进行信息查询、投诉反馈,还是享受便捷的电商服务、法律咨询和融资支持,亦或是利用云ERP和云OA系统提升企业的管理水平和运营效率,智慧园区都以其全面、专业、高效的服务,为企业的发展插上了腾飞的翅膀。而这一切的背后,是大数据、云计算、人工智能等前沿技术的深度融合与应用,它们如同智慧的大脑,让园区的管理和服务变得更加聪明、更加贴心。走进智慧园区,就像踏入了一个充满无限可能的未来世界,这里不仅有科技的魅力,更有生活的温度,让人不禁对未来充满了无限的憧憬与期待。

    边境自驾游异国风情深度体验.doc

    边境自驾游异国风情深度体验

Global site tag (gtag.js) - Google Analytics