6.4.3 持久化
JavaBeans组件在其属性发生变化之后,可以被持久化,以保存组件的内部状态。之后在需要时可以把保存的内容再次读取出来,并恢复组件的内部状态。JavaBeans组件的持久化依赖的是Java标准的对象序列化机制。一般来说,可以把组件的内部状态以流的二进制形式保存,或者保存成XML文件。以流的形式进行持久化时使用的是Java中的java.io.ObjectInputStream和java.io.ObjectOutputStream类,而在以XML文件作为持久化形式时,使用的是java.beans.XMLEncoder和java.beans.XMLDecoder类。
Java 7对将JavaBeans组件保存成XML文档的功能做了更新,在XMLEncoder类中增加了构造方法,可以更加精细地控制保存时的行为。Java 7之前的XMLEncoder构造方法只接受一个java.io.OutputStream类的对象作为参数,表示保存内容的输出流。而Java 7新增的构造方法中添加了额外的3个参数,分别是输出时使用的字符集、是否输出XML处理指令声明和整个XML文档的缩进空格数。允许指定输出时使用的字符集主要是为了满足不同的编码格式需求,而另外两个参数是为了使输出的XML文档内容可以被嵌入到其他XML文档中。代码清单6-20给出了XMLEncoder类的新构造方法的使用示例。如果XMLEncoder类的对象的输出要作为其他XML文档的一部分,第3个参数的值应该为false,另外第4个参数应该是正确的缩进空格数,以保持整个XML文档的良好缩进格式。
代码清单6-20 XMLEncoder类的新的构造方法的使用示例
public void xmlEncode()throws IOException{
OutputStream output=Files.newOutputStream(Paths.get("result.xml"),StandardOpenOption.CREATE_NEW);
try(XMLEncoder encoder=new XMLEncoder(output, StandardCharsets.UTF_8.name(),true,0)){
encoder.writeObject(new MyBean());
}
}
用于读取XMLEncoder类的输出文档的XMLDecoder类也有一些更新,主要是提供了更好的对SAX解析方式的支持。XMLDecoder类新增了一个接受org.xml.sax.InputSource类型参数的构造方法。在Java 7之前,创建XMLDecoder类的对象时,只能使用InputStream类的对象来表示解析时的输入数据。而InputSource类则提供了更加丰富的方式来表示输入数据,除了InputStream类的对象之外,还支持使用标识符和java.io.Reader类的对象。