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

时间:2010-02-16 14:10:40

标签: java xml serialization

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

Class(一些静态值已经改变,但基本上已经改变了),我遗漏了所有生成的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文件,在序列化时没有抛出异常。 它基本上只有很长的价值。

4 个答案:

答案 0 :(得分:4)

XMLEncoder对有关如何还原对象的信息进行编码。如果字段值未从其默认值更改,则XMLEncoder不会存储任何内容。

这可能引起混淆。

因此,使用XMLEncoder时的经验法则是:
  1.不要初始化字段。不要做private String foo = DEFAULT_FOO;
  2.不要在默认构造函数中做任何事情   3.有其他方法,或工厂,如果需要,将给你一个“默认”设置。

答案 1 :(得分:1)

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

  1. 要恢复实例,它需要JVM可用的类定义
  2. 仅序列化数据。并且只修改了默认数据。
  3. 作为上述2点的结果 - 没有理由序列化静态最终值 - 它们是类定义的一部分。
  4. 另一方面,二进制序列化会对类定义进行序列化,并且可以从字节流加载之前不可用于JVM的类。

    这就是为什么你得到的结果。好的,这是设计的行为,你正确使用它。似乎不是你需要的东西。 顺便说一下,看看Xstream提供了什么。

答案 2 :(得分:0)

可能只有mailInterval有一个getter吗?

再看一下这个问题,显然所有领域都有吸气剂......

答案 3 :(得分:0)

什么是SAVED_FOLDER_NAME?这是一个工厂对象,你是否有机会在该对象上调用setMailInterval?