Java XML序列化,文件中缺少字段

Java XML序列化,文件中缺少字段,java,xml,serialization,Java,Xml,Serialization,这就是当前的问题,当尝试用下面的代码序列化下面的类时,我得到的是下面的xml文件,而该类中没有所有字符串 该类(一些静态值已经更改,但基本上已经更改),我省略了所有生成的get\set,但它们都有公共访问修饰符 public class NotificationConfiguration implements Serializable { public static final String PORT_KEY = "mail.smtp.port"; public static

这就是当前的问题,当尝试用下面的代码序列化下面的类时,我得到的是下面的xml文件,而该类中没有所有字符串

该类(一些静态值已经更改,但基本上已经更改),我省略了所有生成的get\set,但它们都有公共访问修饰符

public class NotificationConfiguration implements Serializable
{
    public static final String PORT_KEY =  "mail.smtp.port";
    public static final String DEFAULT_PORT_VALUE =  "587";
    public static final String TTL_KEY = "mail.smtp.starttls.enable";
    public static final String DEFAULT_TTL_VALUE = "true";
    public static final String AUTH_KEY =  "mail.smtp.auth";
    public static final String DEFAULT_AUTH_VALUE = "true";
    public static final String MAIL_SERVER_KEY = "mail.smtp.host";
    public static final String DEFAULT_MAIL_CLIENT_HOST = "smtp.gmail.com";
    public static final String DEFAULT_MAIL_CLIENT_USERNAME = "*********";
    public static final String DEFAULT_MAIL_CLIENT_PASSWORD = "*********";
    public static final String DEFAULT_MAIL_CLIENT_ADDRESS = "*********";
    public static final String DEFAULT_ADMIN_EMAIL = "*********";
    public static final long DEFAULT_MAIL_INTERVAL = 24*60*60*1000; //One time a day default
    public  static final String SAVED_FOLDER_NAME = "C:\\Library";
    public  static final String SAVED_FILE_NAME = "C:\\Library\\NotificationCfg.xml";

    private String portValue = DEFAULT_PORT_VALUE;
    private String ttlValue = DEFAULT_TTL_VALUE;
    private String authValue  = DEFAULT_AUTH_VALUE;
    private String mailClientHost = DEFAULT_MAIL_CLIENT_HOST;
    private String mailClientUserName = DEFAULT_MAIL_CLIENT_USERNAME;
    private String  mailClientPassword = DEFAULT_MAIL_CLIENT_PASSWORD;
    private String mailClientAddress = DEFAULT_MAIL_CLIENT_ADDRESS;
    private String adminEMail = DEFAULT_ADMIN_EMAIL;
    private boolean overdueSubsNotificationEnabled = false;
    private boolean adminReportNotificationEnabled = false;
    private long mailInterval = 
}
用于序列化的代码,如果缺少,也会创建文件夹

public void storeChanges()
{
     try
    {
        try
        {
            File f = new File(NotificationConfiguration.SAVED_FOLDER_NAME);
            f.mkdir();
        }
        catch (Exception e){}
        XMLEncoder encoder = new XMLEncoder( new BufferedOutputStream(new FileOutputStream(NotificationConfiguration.SAVED_FILE_NAME)));
        encoder.writeObject(notificationConfig);
        encoder.close();
        System.out.println(LOG_CONFIGURATION_STORED);
    }
    catch (Exception ex)
    {
        System.out.println(LOG_CONFIGURATION_NOT_STORED + ex.getMessage());
    }
}
已接收XML文件,序列化时未引发异常。
它基本上只有long值。

难道只有mailInterval才有getter吗


刚才又看了一遍问题,显然所有字段都有getter,所以…

XMLEncoder对如何恢复对象的信息进行编码。如果字段值没有改变默认值,XMLEncoder将不存储任何内容

这可能会引起混乱

因此,我在使用XMLEncoder时的经验法则是:
1.不要初始化字段。不要做
private String foo=DEFAULT\u foo
2.不要在默认构造函数中执行任何操作。

3.如果需要,可以使用其他方法或工厂为您提供“默认”设置。

保存的文件夹名称是什么?这像工厂对象吗?您有没有在该对象上调用setMailInterval?

我强烈建议您再次阅读 我将指出我们都知道的二进制序列化的主要区别

  • 要恢复实例,它需要JVM可用的类定义
  • 它只序列化数据。并且只有从默认数据修改的
  • 以上两点的结果是——并没有理由序列化静态最终值——它们是类定义的一部分 另一方面,二进制序列化确实序列化了类定义,并且可以从字节流加载JVM以前不可用的类

    这就是为什么你得到了你所看到的结果。好吧,这是设计的行为,你用对了。这似乎不是你所需要的。
    顺便说一句,看看有什么可以提供。

    Xavier Combelle,感谢您的回复,正如我指出的类代码一样,我在文章中遗漏了get\set,但所有字段都有一个使用netBeans工具生成的公共get\set。确实,在我用工厂方法初始化对象并从类中删除所有默认值之后,收到的xml包含所有字段。谢谢你的快速回复。没有问题。感谢您快速接受对您有用的答案。感谢您的回复,SAVED_FOLDER_NAME只是一个字符串,它指向要保存xml的目录。对不起,我的错。我指的是“notificationConfig”对象。您是否对该对象调用了setMailInterval?