XMLEncoder - это ошибка или я что-то упустил? - PullRequest
0 голосов
/ 04 февраля 2019

Оптимизация состояния инициализации конструктора XMLEncoder великолепна, за исключением случаев, когда вам необходимо кодировать фактический набор состояний, следующий за некоторым состоянием, установленным конструктором.Кажется, это ошибка (или отсутствующая функция :-)).

import java.beans.Encoder;
import java.beans.Expression;
import java.beans.PersistenceDelegate;
import java.beans.XMLEncoder;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class XMLEncoderBug {
    private File file;

    public XMLEncoderBug() {
        //this.setFile(".");
    }

    public File getFile() {
        return this.file;
    }

    public void setFile(String fileName) {
        this.setFile(new File(fileName));
    }

    public void setFile(File file) {
        this.file = file;
    }

    public static void main(String[] args) throws IOException {
        XMLEncoderBug bean = new XMLEncoderBug();
        bean.setFile(new File("./test/test/test"));

        FileOutputStream fout = new FileOutputStream("TestBean.xml");
        XMLEncoder enc = new XMLEncoder(fout);

        enc.setPersistenceDelegate(File.class, new PersistenceDelegate() {
            protected Expression instantiate(Object oldInstance, Encoder out) {
                System.out.printf("FilePersistenceDelegate.instantiate(oldInstance=%s, out)\n", oldInstance.getClass().getName());
                File file = (File)oldInstance;
                String fileName = file.getAbsolutePath();

                return new Expression(file, file.getClass(), "new", new Object[]{ fileName });
            }
        });

        enc.writeObject(bean);
        enc.flush();
        fout.flush();
        enc.close();
        fout.close();
    }
}

Итак, запустите код как есть.Все кодируется, как и ожидалось.Затем откомментируйте строку в конструкторе и запустите ее снова.Обратите внимание, что фактическое состояние компонента не сохраняется должным образом.

Теперь я понимаю оптимизацию XMLEncoder для того, чтобы не кодировать любое состояние, установленное конструктором без аргументов, потому что в этом нет необходимости, поскольку во время декодированияконструктор вызывается и состояние инициализируется тем, что делает конструктор.

Но когда состояние каким-то образом инициализируется конструктором и впоследствии изменяется , постоянное состояние экземпляра определенно не кодируется правильно.

Ячто-то упустил?

Кстати: Java 1.8.

...