0

XMLEncoder 如何知道在对象的构造函数中设置了一个属性,从而避免输出它?

这是一个简单的示例(在 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;
 }      
}

现在,实例化对象的 main 函数在其中一个属性上使用 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 有一个水晶球,并且知道过去发生了什么!

4

1 回答 1

0

它实际上看起来相反,好像它有健忘症,它可以同时输出 n 和 m 但它只打印一个属性,即受你的 setter 影响的属性。

但是官方文档

结构紧凑:XMLEncoder 类在内部使用冗余消除算法,因此 Bean 属性的默认值不会写入流。

所以它解释了它的选择性

于 2016-12-31T04:58:34.397 回答