Java XML Сериализация, Отсутствие полей в файле - PullRequest
4 голосов
/ 16 февраля 2010

это проблема под рукой, когда я пытаюсь сериализовать класс ниже с кодом ниже, я получаю следующий 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-файл без каких-либо исключений при сериализации. В основном это просто длинное значение.

Ответы [ 4 ]

4 голосов
/ 16 февраля 2010

XMLEncoder кодирует информацию о том, как восстановить ваш объект. Если значения полей не изменились по умолчанию, XMLEncoder ничего не хранит.

Это может вызвать путаницу.

Следовательно, мои эмпирические правила при использовании XMLEncoder:
1. не инициализируйте поля. не делай private String foo = DEFAULT_FOO;
2. ничего не делать в конструкторе по умолчанию.
3. есть какой-то другой метод или завод, который при необходимости даст вам настройку «по умолчанию».

1 голос
/ 16 февраля 2010

Я настоятельно рекомендую прочитать снова XMLEncoder Javadoc Я укажу на основные различия с двоичной сериализацией, которую мы все знаем.

  1. для восстановления экземпляра необходимо определение класса, доступное для JVM
  2. Сериализует только данные. И только измененные по умолчанию данные.
  3. Как результат 2 пунктов выше - это то, что нет оснований для сериализации статических конечных значений - они являются частью определения класса.

С другой стороны, двоичная сериализация действительно сериализует определение класса и может загружать из потока байтов класс, который ранее не был доступен JVM.

Вот почему вы получили результаты, которые видите. Это нормально, это поведение по дизайну, и вы используете его правильно. Кажется, просто не то, что вам нужно. Кстати, посмотрите, что может предложить Xstream .

0 голосов
/ 16 февраля 2010

Что такое SAVED_FOLDER_NAME? Это как фабричный объект, и вы случайно не вызывали setMailInterval для этого объекта?

0 голосов
/ 16 февраля 2010

Может ли быть так, что только mailInterval имеет геттер?

Только что снова посмотрел вопрос, видимо, для всех полей есть геттер, так что ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...