模块  java.desktop
软件包  java.beans

Class 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更改引起的,仍然是本地化的,以便读者可以报告错误并继续加载文档的部分而不是受错误影响。

    下面是一个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
    • 在表示名称以“get”开头的nullary方法的元素中,“method”属性被替换为“property”属性,其属性值通过删除“get”前缀并对结果进行decapitalizing来给出。
    • 在表示名称以“set”开头的monadic方法的元素中,“method”属性被替换为“property”属性,其属性值通过删除“set”前缀并对结果进行decapitalizing来给出。
    • 在表示名为“get”的方法的元素中,取一个整数参数,“method”属性将替换为“index”属性,其值为第一个参数的值。
    • 在表示名为“set”的方法的元素中,该方法采用两个参数,第一个是整数,“method”属性替换为“index”属性,其值为第一个参数的值。
    • 使用“array”标记写入对数组的引用。 “class”和“length”属性分别指定数组的子类型及其长度。

    有关更多信息,您可能还需要查看Using XMLEncoderThe Swing Connection中的一篇文章

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