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();
}
}
因此,按原样运行代码。一切都按预期进行编码。然后,取消注释构造函数中的行,然后再次运行它。请注意,bean的实际状态是如何无法正确持久的。
现在,我了解XMLEncoder的优化方法是不对无参数构造函数设置的任何状态进行编码,因为不需要,因为在解码期间,将调用构造函数并将状态初始化为构造函数执行的任何操作。
但是,当状态由构造函数初始化并随后更改时,实例的持久状态肯定没有正确编码。
我想念什么吗?
顺便说一句:Java 1.8。