XMLEncoder如何知道在对象的构造函数中设置了属性,从而避免输出它?XMLEncoder writeObject跳过在构造函数中初始化的属性
下面是一个简单的例子(关于Java 1.8上运行),这说明了这一点: 首先定义一个getter和setter和默认构造方法的简单对象:
public class Simple {
int m;
int n;
public int getM() { return m;}
public void setM(int m) {this.m = m;}
public int getN() {return n;}
public void setN(int n) {this.n = n; }
public String toString() {
return "m=" + m + ",n=" + n;
}
public Simple() {
this.m = 1;
this.n = 2;
}
}
现在主要的,它实例化对象,在其中一个属性上使用setter,并在最终对象上调用XMLEncoder。为了确保我调用编码器之前还打印对象的属性:
public class Main {
public static void main(String[] args) {
Simple simple = new Simple();
simple.setN(7);
System.out.println(simple.toString());
XMLEncoder encoder=null;
try{
encoder=new XMLEncoder(new BufferedOutputStream(
new FileOutputStream("simple.xml")));
}catch(FileNotFoundException fileNotFound){
System.out.println("ERROR: While Creating the File ");
}
encoder.writeObject(simple);
encoder.close();
}
}
程序运行后,我得到预期的输出: M = 1,N = 7 然而,当我看到生成的文件,我得到:
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_112" class="java.beans.XMLDecoder">
<object class="simple.Simple">
<void property="n">
<int>7</int>
</void>
</object>
</java>
在这里,我们看到,只有一个属性是通过输出XMLEncoder,而对象的前面打印输出显示,这两个属性有它们的值设置。就好像XMLEncoder有一个水晶球,知道过去发生了什么!
看起来相反的,因为如果有失忆,它可能有两个输出n和m,但它并只打印一个属性 –