XStream与Java.Bean中XML工具的比较
XStream主要作用是将序列化的对象转化为一个XML文件或将XML文件解析为一个对象。当然并非只有它可以做到,很多其它工具一样可以,在Java中存在这样两个类XMLDecoder和XMLEncoder,它们是在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);//使用XMLEncode的writeObject方法输出pu
xmle.flush();//刷新
xmle.close();//关闭输出流
从上面的代码不难看出,使用XMLEncode方式将对象序列化并输出也是很方便的,简单调用writeObject方法能将普通Bean输出为XML文件。
XML文件的内容:
�_ <?xml version="1.0" encoding="UTF-8"?>
<java version="
<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所生成的更多,包括了XML和Java的版本看上去更像是个完整的XML文件,不过再细看它们两生成的XML格式内容,完全不同,这个我想就是它们最大的区别。这让我想到了很多内容:工作方式,解析器,转换方式等。大家有没发现在开始和结束都存在一些乱码数据,难道在XMLEncoder输出过程中或数据转换中内容已经存在“脏”数据了?还是我所使用的输出方式存在问题?哎…一个又一个问题出现了。我想我需要再进一步的研究和学习才能得到答案。
不过尽管有这个那个的问题,使用Java本身自带的XML工具还是一样很实用的,读取和输出一样可用,操作也很灵活。因此我觉得在某些场合使用特定的工具可能会更好,利用XMLEncoder和XMLDecoder同样可以解决一些问题。
XStream 有三个突出的优点:
- XStream 不关心序列化/逆序列化的类的字段的可见性。
- 序列化/逆序列化类的字段不需要 getter 和 setter 方法。
- 序列化/逆序列化的类不需要有默认构造函数。
不需要修改类,使用 XStream 就能直接序列化/逆序列化任何第三方类。