Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XMLEncoder writeObject跳过构造函数中初始化的属性_Java_Xmlencoder - Fatal编程技术网

Java XMLEncoder writeObject跳过构造函数中初始化的属性

Java XMLEncoder writeObject跳过构造函数中初始化的属性,java,xmlencoder,Java,Xmlencoder,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;} pub

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,并在最终对象上调用xmlcoder。为了确保在调用编码器之前也打印对象的属性:

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>

7.

这里我们看到只有一个属性是由XMLEncoder输出的,而之前的对象打印输出显示这两个属性都设置了它们的值。就好像XMLEncoder有一个水晶球,知道过去发生了什么

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

但是说

结构紧凑:XMLEncoder类使用冗余 内部消除算法,使 Bean的属性不会写入流


所以它解释了它的选择性

它看起来正好相反,好像它有健忘症,它可以同时输出n和m,但它只打印了一个属性啊哈!这是有意义的,即当我使用XMLDecoder解码文件时,对象的实例化将初始化构造函数中的属性,并且只覆盖在构造函数之外设置的属性。是的,完全正确。很好的优化,只是不是很明显经过进一步思考,我发现这种行为存在问题。如果使用XMLEncoder存储具有某些属性的文件,然后更改对象构造函数中的默认值,并在原始文件上运行XMLDecoder,则对象中的值将与上次运行中的值不同。对此不确定。这是一个常见的问题,若您更改了数据的表示形式,则不应反序列化旧的保存,请使用版本放弃以前的表单