我在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变量上设置了anotherObjectinstance的值,而不是将其初始化为默认值,则一切都会按预期进行。

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

09-11 21:10