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.0class="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同样可以解决一些问题。

 

 

XStream 有三个突出的优点:

  1. XStream 不关心序列化/逆序列化的类的字段的可见性。
  2. 序列化/逆序列化类的字段不需要 getter 和 setter 方法。
  3. 序列化/逆序列化的类不需要有默认构造函数。

不需要修改类,使用 XStream 就能直接序列化/逆序列化任何第三方类。