- java.lang.Object
-
- java.beans.Encoder
-
- java.beans.XMLEncoder
-
- 实现的所有接口
-
AutoCloseable
public class XMLEncoderextends Encoderimplements 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 XMLEncoder , The Swing Connection中的一篇文章。
- 从以下版本开始:
- 1.4
- 另请参见:
-
XMLDecoder
,ObjectOutputStream
-
-
构造方法摘要
构造方法 构造器 描述 XMLEncoder(OutputStream out)
创建一个新的XML编码器,使用XML编码将 JavaBeans写入流out
。XMLEncoder(OutputStream out, String charset, boolean declaration, int indentation)
创建一个新的XML编码器 的JavaBeans写出到流out
使用给定charset
从给定的起始indentation
。
-
方法摘要
所有方法 实例方法 具体的方法 变量和类型 方法 描述 void
close()
此方法调用flush
,写入结束后同步码,然后关闭与此流关联的输出流。void
flush()
如果尚未编写,则此方法会写出与XML编码关联的前导码,然后写出自上次调用flush
以来写入流的所有值。Object
getOwner()
获取此编码器的所有者。void
setOwner(Object owner)
将此编码器的所有者设置为owner
。void
writeExpression(Expression oldExp)
记录Expression,以便在刷新流时Encoder将生成实际输出。void
writeObject(Object o)
将指定对象的XML表示写入输出。void
writeStatement(Statement oldStm)
记录Statement,以便在刷新流时Encoder将生成实际输出。-
声明方法的类 java.beans.Encoder
get, getExceptionListener, getPersistenceDelegate, remove, setExceptionListener, setPersistenceDelegate
-
-
-
-
构造方法详细信息
-
XMLEncoder
public XMLEncoder(OutputStream out)
创建一个新的XML编码器,使用XML编码将 JavaBeans写入流out
。- 参数
-
out
- 将写入对象的XML表示的流 - 异常
-
IllegalArgumentException
- 如果out
是null
- 另请参见:
-
XMLDecoder(InputStream)
-
XMLEncoder
public XMLEncoder(OutputStream out, String charset, boolean declaration, int indentation)
创建一个新的XML编码器 的JavaBeans写出到流out
使用给定charset
从给定的起始indentation
。- 参数
-
out
- 将写入对象的XML表示的流 -
charset
- 请求的charset的名称; 可以是规范名称或别名 -
declaration
- 是否应生成XML声明; 将内容嵌入另一个XML文档时,将其设置为false
-
indentation
- 用于缩进整个XML文档的空格字符数 - 异常
-
IllegalArgumentException
- 如果out
或charset
是null
,或者如果indentation
小于0 -
IllegalCharsetNameException
- 如果charset
名称是非法的 -
UnsupportedCharsetException
- 如果在此Java虚拟机实例中不支持指定的charset -
UnsupportedOperationException
- 如果加载的charset不支持编码 - 从以下版本开始:
- 1.7
- 另请参见:
-
Charset.forName(String)
-
-
方法详细信息
-
setOwner
public void setOwner(Object owner)
将此编码器的所有者设置为owner
。- 参数
-
owner
- 此编码器的所有者。 - 另请参见:
-
getOwner()
-
getOwner
public Object getOwner()
获取此编码器的所有者。- 结果
- 此编码器的所有者。
- 另请参见:
-
setOwner(java.lang.Object)
-
writeObject
public void writeObject(Object o)
将指定对象的XML表示写入输出。- 重写:
-
writeObject
在类Encoder
- 参数
-
o
-o
的对象。 - 另请参见:
-
XMLDecoder.readObject()
-
writeStatement
public void writeStatement(Statement oldStm)
记录Statement,以便在刷新流时Encoder将生成实际输出。只应在初始化持久委托的上下文中调用此方法。
- 重写:
-
writeStatement
类Encoder
- 参数
-
oldStm
- 将写入流的语句。 - 另请参见:
-
PersistenceDelegate.initialize(java.lang.Class<?>, java.lang.Object, java.lang.Object, java.beans.Encoder)
-
writeExpression
public void writeExpression(Expression oldExp)
记录Expression,以便在刷新流时Encoder将生成实际输出。只应在初始化持久委托或设置编码器以从资源包中读取的上下文中调用此方法。
有关将资源包与XMLEncoder一起使用的更多信息,请参阅Creating Internationalized Applications ,
- 重写:
-
writeExpression
在课程Encoder
- 参数
-
oldExp
- 将写入流的表达式。 - 另请参见:
-
PersistenceDelegate.initialize(java.lang.Class<?>, java.lang.Object, java.lang.Object, java.beans.Encoder)
-
flush
public void flush()
如果尚未编写,则此方法会写出与XML编码关联的前导码,然后写出自上次调用flush
以来写入流的所有值。 刷新后,将清除对写入此流的值的所有内部引用。
-
close
public void close()
此方法调用flush
,写入结束后同步码,然后关闭与此流关联的输出流。- Specified by:
-
close
in interfaceAutoCloseable
-
-