java.lang.Object
java.beans.Encoder
java.beans.XMLEncoder
- 所有实现的接口:
-
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
- 参见:
-
Constructor Summary
ConstructorsConstructorDescriptionXMLEncoder(OutputStream out) 创建一个新的XML编码器,使用XML编码将JavaBeans写入流out。XMLEncoder(OutputStream out, String charset, boolean declaration, int indentation) 创建一个新的XML编码器,使用给定的charset从给定的indentation开始将JavaBeans写入流out。 -
Method Summary
Modifier and TypeMethodDescriptionvoidclose()该方法调用flush,写入关闭的尾部,然后关闭与此流关联的输出流。voidflush()该方法写入与XML编码相关的前言(如果尚未写入),然后写入自上次调用flush以来写入流的所有值。getOwner()获取此编码器的所有者。void将此编码器的所有者设置为owner。voidwriteExpression(Expression oldExp) 记录表达式,以便在刷新流时编码器将生成实际输出。void将指定对象的XML表示写入输出。voidwriteStatement(Statement oldStm) 记录语句,以便在刷新流时编码器将生成实际输出。Methods declared in class java.beans.Encoder
get, getExceptionListener, getPersistenceDelegate, remove, setExceptionListener, setPersistenceDelegate
-
Constructor Details
-
XMLEncoder
创建一个新的XML编码器,使用XML编码将JavaBeans写入流out。- 参数:
-
out- 将写入对象的XML表示的流 - 抛出:
-
IllegalArgumentException- 如果out为null - 参见:
-
XMLEncoder
创建一个新的XML编码器,使用给定的charset从给定的indentation开始将JavaBeans写入流out。- 参数:
-
out- 将写入对象的XML表示的流 -
charset- 请求的字符集的名称;可以是规范名称或别名 -
declaration- 是否应生成XML声明;在将内容嵌入另一个XML文档时,将其设置为false -
indentation- 整个XML文档缩进的空格字符数 - 抛出:
-
IllegalArgumentException- 如果out或charset为null,或者indentation小于0 -
IllegalCharsetNameException- 如果字符集名称非法 -
UnsupportedCharsetException- 如果Java虚拟机实例中不支持命名字符集 -
UnsupportedOperationException- 如果加载的字符集不支持编码 - 自:
- 1.7
- 参见:
-
-
Method Details
-
setOwner
将此编码器的所有者设置为owner。- 参数:
-
owner- 此编码器的所有者。 - 参见:
-
getOwner
获取此编码器的所有者。- 返回:
- 此编码器的所有者。
- 参见:
-
writeObject
将指定对象的XML表示写入输出。- 覆盖:
-
writeObject在类中的覆盖Encoder - 参数:
-
o- 要写入流的对象。 - 参见:
-
writeStatement
记录语句,以便在刷新流时,编码器将生成实际输出。此方法只应在初始化持久性委托的上下文中调用。
- 覆盖:
-
writeStatement在类中的覆盖Encoder - 参数:
-
oldStm- 将写入流的语句。 - 参见:
-
writeExpression
记录表达式,以便在刷新流时,编码器将生成实际输出。此方法只应在初始化持久性委托的上下文中调用,或者设置编码器以从资源包中读取。
有关在XMLEncoder中使用资源包的更多信息,请参见创建国际化应用程序。
- 覆盖:
-
writeExpression在类中的覆盖Encoder - 参数:
-
oldExp- 将写入流的表达式。 - 参见:
-
flush
public void flush()如果尚未写入XML编码相关的序言,则此方法将写出所有自上次调用flush以来写入流的所有值。刷新后,清除对此流中写入的值的所有内部引用。 -
close
public void close()此方法调用flush,写入关闭的尾声,然后关闭与此流相关联的输出流。- 指定者:
-
close在接口中的指定者AutoCloseable
-