2016-12-31 9 views
0

Как XMLEncoder знает, что свойство было установлено в конструкторе объекта и, следовательно, не выводить его?XMLEncoder writeObject пропускает свойства, инициализированные в конструкторе

Вот простой пример (работает на Java 1.8), который демонстрирует это: Сначала определим простой объект с добытчиками и сеттеров и конструктор по умолчанию:

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; 
}  
} 

В настоящее время основной, который инициализирует объект, использует установщик по одному из свойств и вызывает 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(); 
    } 
} 

Запуск программы, я получаю ожидаемый результат: т = 1, п = 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 имеет хрустальный шар и знает, что произошло в прошлом!

+0

это выглядит наоборот, как будто он имеет амнезию, он может иметь выход как п и м но это напечатать только одно свойство –

ответ

0

На самом деле он выглядит наоборот, как будто он имеет амнезию, он может выводить как n, так и m, но он только печатает одно свойство, которое было затронуто вашим сеттером.

Official doc Но говорит

Конструктивно компактен: Класс XMLEncoder использует алгоритм устранения избыточности внутренне, так что значения по умолчанию свойств а бин не записаны в поток.

Так что объясняет ее избирательный характер

+0

Ах-ха! Это имеет смысл, т. Е. Когда я декодирую файл с помощью XMLDecoder, инстанцирование объекта будет инициализировать свойства в конструкторе и только перезаписать те, которые установлены снаружи. –

+0

да, точно. Хорошая оптимизация, просто не очень очевидная –

+0

После некоторой мысли, я вижу проблему с этим поведением. Если я использую XMLEncoder для хранения файла с определенными свойствами, измените значения по умолчанию в конструкторе объектов и запустите XMLDecoder в исходном файле, у меня будут разные значения в объекте, чем в предыдущем. Не уверен в этом. –

 Смежные вопросы

  • Нет связанных вопросов^_^