我在XMLEncoder中遇到以下问题。我想序列化如下所示的类:
public class MyClass{
private Object myObject;
private Object anotherObject;
private static MyClass instance = new MyClass();
[myObject and anotherObject are set in the class later...]
public static MyClass getInstance(){
return instance;
}
[getter and setter methods here]
}
现在我想像这样在MyClass中序列化对象:
public void saveObject(){
[try catch stuff not shown]
FileOutputStream fos = new FileOutputStream(new File("object.xml"));
XMLEncoder xmle = new XMLEncoder(fos);
xmle.writeObject(instance);
xmle.close();
}
但是我的object.xml不包含myObject和anotherInstance的值,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.6.0_24" class="java.beans.XMLDecoder">
<object class="MyClass"/>
</java>
发生什么事了? XMLEncoder是否检测到具有相同类的静态字段的循环,并且不会进一步序列化它?但我没有任何错误...
我可以将该字段标记为“不可序列化”或其他内容吗?
最佳答案
如果要在任何类(不遵循JavaBeans约定的类)上使用XmlEncoder,那么这里是一个有用的链接。
Advanced use of XmlEncoder
编辑:里面有一点点可能会对您有所帮助。
XMLEncoder的工作原理是克隆对象图并记录创建克隆所必需的步骤。这样,XMLEncoder具有对象图的“工作副本”,该对象图模仿XMLDecoder解码文件所采取的步骤。通过监视此工作副本的状态,编码器可以省略将属性值设置为其默认值的操作,从而生成简明的文档,而这些文档的冗余信息很少。
因此,在您的示例中,如果在myObject
变量上设置了anotherObject
和instance
的值,而不是将其初始化为默认值,则一切都会按预期进行。
public void saveObject(){
[try catch stuff not shown]
instance.setObject(new Object());
FileOutputStream fos = new FileOutputStream(new File("object.xml"));
XMLEncoder xmle = new XMLEncoder(fos);
xmle.writeObject(instance);
xmle.close();
}