java.beans

接口
异常
注释
java.lang.Object
  继承者 java.beans.Encoder
      继承者 java.beans.XMLEncoder

public class XMLEncoder
     
extends Encoder

XMLEncoder 类是 ObjectOutputStream 的互补替换,可用于生成 JavaBean 的文本表示形式,所使用方式与用 ObjectOutputStream 创建 Serializable 对象的二进制表示形式的方式相同。例如,可以使用以下代码片段创建所提供的 JavaBean 及其所有属性的文本表示形式:

       XMLEncoder e = new XMLEncoder(
                          new BufferedOutputStream(
                              new FileOutputStream("Test.xml")));
       e.writeObject(new JButton("Hello, world"));
       e.close();
 
尽管两者的 API 类似,但 XMLEncoder 类仅设计用于将 JavaBean 的图形归档为其公共属性的文本表示形式。与 Java 源文件类似,以这种方式写入的文档在所涉及类的实现中可自然免除更改。在进程间通信和通用序列化中继续推荐使用 ObjectOutputStream

XMLEncoder 类提供 JavaBean 的默认指示,其中它们被表示为符合 1.0 版的 XML 规范和 Unicode/ISO 10646 字符集 UTF-8 字符编码的 XML 文档。由 XMLEncoder 类生成的 XML 文档如下:

  • 轻便且版本灵活:它们不依赖于任何类的私有实现,因此,与 Java 源文件类似,可以在某些不同版本的类之间或不同的供应商的 VM 之间交换它们。
  • 结构紧凑XMLEncoder 类在内部使用删减冗余 (redundancy elimination) 算法,因此 Bean 属性的默认值不会被写入流中。
  • 容错性:文件中的非结构性错误(由于文件的破坏或在归档文件中对类进行的 API 更改导致)仍然保持本地化,因此 reader 可以报告错误,并继续加载不受错误影响的那部分文档。

以下是一个 XML 归档文件的示例,它包含 swing 工具包中一些用户界面组件:

 <?xml version="1.0" encoding="UTF-8"?>
 <java version="1.0" class="java.beans.XMLDecoder">
 <object class="javax.swing.JFrame">
   <void property="name">
     <string>frame1</string>
   </void>
   <void property="bounds">
     <object class="java.awt.Rectangle">
       <int>0</int>
       <int>0</int>
       <int>200</int>
       <int>200</int>
     </object>
   </void>
   <void property="contentPane">
     <void method="add">
       <object class="javax.swing.JButton">
         <void property="label">
           <string>Hello</string>
         </void>
       </object>
     </void>
   </void>
   <void property="visible">
     <boolean>true</boolean>
   </void>
 </object>
 </java>
 
XML 语法使用以下约定:
  • 每个元素表示一个方法调用。
  • "object" 标记表示一个表达式,其值被用作参数来封闭元素。
  • "void" 标记表示将要执行的语句,但其结果不会被用作参数来封闭方法。
  • 包含元素的元素使用这些元素作为参数,除非它们有以下标记:"void"。
  • 方法的名称由 "method" 属性表示。
  • XML 的标准 "id" 和 "idref" 属性用于引用以前的表达式,以便处理对象图形中的环形。
  • "class" 属性用于显式指定静态方法的目标或构造方法;其值是类的完全限定名。
  • 如果没有通过 "class" 属性定义目标,则使用外部上下文将带有 "void" 标记的元素作为目标执行。
  • Java 的 String 类被特殊对待并被写入 <string>Hello, world</string>,其中使用 UTF-8 字符编码将字符串的字符转换成字节。

尽管只使用这三个标记就可以写入所有对象图形,但以下定义也包括在内,以便能够更具体地表示普通数据结构:

  • 默认方法名是 "new"。
  • java 类的引用是以 <class>javax.swing.JButton</class> 形式写入的。
  • 用于 Java 基本类型的包装器类的实例是通过将基本类型的名称用做标记来写入的。例如,Integer 类的实例可以写为:<int>123</int>。注意,XMLEncoder 类使用了 Java 的反射包,在该包中,Java 的基本类型与其相关“包装器类”之间的转换是内部处理的。XMLEncoder 类自身的 API 只处理 Object
  • 在表示 null 方法(其名称以 "get" 开头)的元素中,"method" 属性被 "property" 属性替代,后者的值是通过移除 "get" 前缀并取消所得结果的大写化得到的。
  • 在表示一元方法(其名称以 "set" 开头)的元素中,"method" 属性被 "property" 属性替代,后者的值是通过移除 "set" 前缀并取消所得结果的大写化得到的。
  • 在表示名为 "get" 且使用一个整数参数的方法的元素中,"method" 属性由 "index" 属性替换,后者的值是第一个参数的值。
  • 在表示名为 "set" 且使用两个参数(第一个参数为整数)的方法的元素中,"method" 属性由 "index" 属性替换,后者的值是第一个参数的值。
  • 数组的引用是使用 "array" 标记来编写的。"class" 和 "length" 属性分别指定数组的子类型和它的长度。

有关的更多信息,还可以参阅 The Swing Connection 中的 Using XMLEncoder 一文。

从以下版本开始:
1.4
另请参见:
XMLDecoder, ObjectOutputStream

构造方法摘要
XMLEncoder(OutputStream out)
          使用 XML 编码创建一个新的输出流,将 JavaBeans 发送给流 out
 
方法摘要
 void close()
          此方法调用 flush,写入结束后文,然后关闭与此流有关的输出流。
 void flush()
          如果还没有写出导言,那么此方法将写出与 XML 编码有关的导言,并随后写出从最后一次调用 flush 以来写入流中的所有值。
 Object getOwner()
          获得此编码器的所有者。
 void setOwner(Object owner)
          将此编码器的所有者设置为 owner
 void writeExpression(Expression oldExp)
          记录 Expression,以便 Encoder 在刷新流的缓存时产生实际输出。
 void writeObject(Object o)
          将指定对象的 XML 表示形式写入输出中。
 void writeStatement(Statement oldStm)
          记录 Statement,以便 Encoder 在刷新流的缓存时产生实际输出。
 
从类 java.beans.Encoder 继承的方法
get, getExceptionListener, getPersistenceDelegate, remove, setExceptionListener, setPersistenceDelegate
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

XMLEncoder

public XMLEncoder(OutputStream out)
使用 XML 编码创建一个新的输出流,将 JavaBeans 发送给流 out

参数:
out - 接收对象的 XML 表示形式的流。
另请参见:
XMLDecoder.XMLDecoder(InputStream)
方法详细信息

setOwner

public void setOwner(Object owner)
将此编码器的所有者设置为 owner

参数:
owner - 此编码器的所有者。
另请参见:
getOwner()

getOwner

public Object getOwner()
获得此编码器的所有者。

返回:
此编码器的所有者。
另请参见:
setOwner(java.lang.Object)

writeObject

public void writeObject(Object o)
将指定对象的 XML 表示形式写入输出中。

覆盖:
Encoder 中的 writeObject
参数:
o - 要写入流中的对象。
另请参见:
XMLDecoder.readObject()

writeStatement

public void writeStatement(Statement oldStm)
记录 Statement,以便 Encoder 在刷新流的缓存时产生实际输出。

此方法只应在初始化持久委托的上下文中调用。

覆盖:
Encoder 中的 writeStatement
参数:
oldStm - 将写入流中的语句。
另请参见:
PersistenceDelegate.initialize(java.lang.Class , java.lang.Object, java.lang.Object, java.beans.Encoder)

writeExpression

public void writeExpression(Expression oldExp)
记录 Expression,以便 Encoder 在刷新流的缓存时产生实际输出。

此方法只应在初始化持久委托或设置编码器从资源包中读取数据的上下文中调用。

有关利用 XMLEncoder 使用资源包的更多信息,请参阅 http://java.sun.com/products/jfc/tsc/articles/persistence4/#i18n

覆盖:
Encoder 中的 writeExpression
参数:
oldExp - 将写入流中的表达式。
另请参见:
PersistenceDelegate.initialize(java.lang.Class , java.lang.Object, java.lang.Object, java.beans.Encoder)

flush

public void flush()
如果还没有写出导言,那么此方法将写出与 XML 编码有关的导言,并随后写出从最后一次调用 flush 以来写入流中的所有值。在刷新缓存之后,对已写入此流中的值的所有内部引用都被清除。


close

public void close()
此方法调用 flush,写入结束后文,然后关闭与此流有关的输出流。