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
ConstructorDescriptionXMLEncoder
(OutputStream out) 创建一个新的XML编码器,使用XML编码将JavaBeans写入流out
。XMLEncoder
(OutputStream out, String charset, boolean declaration, int indentation) 创建一个新的XML编码器,使用给定的charset
从给定的indentation
开始将JavaBeans写入流out
。 -
Method Summary
Modifier and TypeMethodDescriptionvoid
close()
该方法调用flush
,写入关闭的尾部,然后关闭与此流关联的输出流。void
flush()
该方法写入与XML编码相关的前言(如果尚未写入),然后写入自上次调用flush
以来写入流的所有值。getOwner()
获取此编码器的所有者。void
将此编码器的所有者设置为owner
。void
writeExpression
(Expression oldExp) 记录表达式,以便在刷新流时编码器将生成实际输出。void
将指定对象的XML表示写入输出。void
writeStatement
(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
-