Module java.desktop
Package java.beans

Class XMLEncoder

java.lang.Object
java.beans.Encoder
java.beans.XMLEncoder
所有实现的接口:
AutoCloseable

public class XMLEncoder extends Encoder implements AutoCloseable
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提供了默认的表示,其中它们被表示为符合XML规范版本1.0和Unicode/ISO 10646字符集的UTF-8字符编码的XML文档。由XMLEncoder类生成的XML文档具有以下特点:

  • 可移植且版本兼容:它们不依赖于任何类的私有实现,因此,像Java源文件一样,它们可以在可能具有某些类的不同版本和来自不同供应商的VM之间交换。
  • 结构紧凑XMLEncoder类在内部使用冗余消除算法,因此不会将Bean属性的默认值写入流。
  • 容错:文件中的非结构错误,无论是由文件损坏还是由于对存档中的类进行的API更改,都会保持局部化,以便读者可以报告错误并继续加载未受错误影响的文档部分。

以下是包含来自swing工具包的一些用户界面组件的XML归档的示例:

 <?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
  • 在表示以"get"开头的无参数方法的元素中,"method"属性将替换为"property"属性,其值为去除"get"前缀并将结果小写化的名称。
  • 在表示以"set"开头的一元方法的元素中,"method"属性将替换为"property"属性,其值为去除"set"前缀并将结果小写化的名称。
  • 在表示带有一个整数参数的名为"get"的方法的元素中,"method"属性将替换为"index"属性,其值为第一个参数的值。
  • 在表示带有两个参数的名为"set"的方法的元素中,第一个参数为整数,"method"属性将替换为"index"属性,其值为第一个参数的值。
  • 引用数组使用"array"标记进行编写。"class"和"length"属性分别指定数组的子类型和长度。

更多信息,您可能还想查看 使用XMLEncoder,这是The Swing Connection中的一篇文章。

自:
1.4
参见: