Module  java.desktop
软件包  java.beans

Class XMLEncoder

  • All Implemented Interfaces:
    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的XML文档和Unicode / ISO 10646字符集的UTF-8字符编码。 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语法使用以下约定:
    • 每个元素表示方法调用。
    • “对象”标签表示一个表达式,其值将用作封闭元素的参数。
    • “void”标签表示将被执行的语句 ,但其结果将不会用作封闭方法的参数。
    • 包含元素的元素使用这些元素作为参数,除非它们具有标签:“void”。
    • 方法的名称由“method”属性表示。
    • XML的标准“id”和“idref”属性用于对前面的表达式进行引用,以便处理对象图形中的循环。
    • “类”属性用于明确指定静态方法或构造函数的目标; 其值是该类的完全限定名称。
    • 如果没有由“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”标签写入数组的引用。 “类”和“长度”属性分别指定数组的子类型及其长度。

    有关更多信息,您可能还需要查看Using XMLEncoder“Swing连接”中的一篇文章

    从以下版本开始:
    1.4
    另请参见:
    XMLDecoderObjectOutputStream