这是当前的问题,当尝试使用下面的代码序列化下面的类时,我得到的是下面的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文件,在序列化时没有抛出异常。 它基本上只有很长的价值。
答案 0 :(得分:4)
XMLEncoder对有关如何还原对象的信息进行编码。如果字段值未从其默认值更改,则XMLEncoder不会存储任何内容。
这可能引起混淆。
因此,使用XMLEncoder时的经验法则是:
1.不要初始化字段。不要做private String foo = DEFAULT_FOO;
2.不要在默认构造函数中做任何事情
3.有其他方法,或工厂,如果需要,将给你一个“默认”设置。
答案 1 :(得分:1)
我强烈建议您再次阅读XMLEncoder Javadoc 我将指出我们都知道的二进制序列化的主要区别。
另一方面,二进制序列化会对类定义进行序列化,并且可以从字节流加载之前不可用于JVM的类。
这就是为什么你得到的结果。好的,这是设计的行为,你正确使用它。似乎不是你需要的东西。 顺便说一下,看看Xstream提供了什么。
答案 2 :(得分:0)
可能只有mailInterval有一个getter吗?
再看一下这个问题,显然所有领域都有吸气剂......
答案 3 :(得分:0)
什么是SAVED_FOLDER_NAME?这是一个工厂对象,你是否有机会在该对象上调用setMailInterval?