Java XML序列化,文件中缺少字段
这就是当前的问题,当尝试用下面的代码序列化下面的类时,我得到的是下面的xml文件,而该类中没有所有字符串 该类(一些静态值已经更改,但基本上已经更改),我省略了所有生成的get\set,但它们都有公共访问修饰符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
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?