Сериализация ENUM Singleton - PullRequest
       18

Сериализация ENUM Singleton

1 голос
/ 28 января 2010

Я пытаюсь сериализовать одноэлементный экземпляр ENUM (как описано Джошуа Блохом в его книге «Эффективная Java») в файл. Экземпляр ENUM является простым JavaBean следующим образом:

public enum ElvisFan implements Serializable{
  INSTANCE;
  private int totalSongsListened;

private ElvisFan(){
     totalSongsListened=0;
}

public void set(int v){
     totalSongsListened=v;
}

public int get(){
     return totalSongsListened;
}

}
}

Я успешно использую это перечисление во всей своей программе, но когда я записываю это перечисление в файл, используя snakeyaml, в моем test.yaml файле просто появляется !!com.chown.ElvisFan 'INSTANCE'. Вот что я делаю:

Yaml yaml = new Yaml();
yaml.dump(ElvisFan.INSTANCE, new FileWriter("test.yml");

Я тоже безуспешно пытался:

JavaBeanDumper dumper = new JavaBeanDumper();
dumper.dump(ElvisFan.INSTANCE, new FileWriter("test.yml");

Может кто-нибудь, пожалуйста, направьте меня в этом. Спасибо!

[Изменено]

Исправление кода.

Ответы [ 2 ]

4 голосов
/ 28 января 2010

Синглтоны не имеют смысла. Сериализуемые синглтоны имеют еще меньше смысла. Существует по определению только один синглтон. Поэтому, когда вы десериализуете синглтон, вы не получите новый объект. Вы получите тот же старый экземпляр с теми же старыми данными.

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

Я предлагаю изменить ваш код, чтобы избежать изменчивой статики.

Перечисления не должны иметь изменяемого состояния. Сериализация перечислений с одним экземпляром может иметь смысл, когда они реализуют какой-то другой класс, такой как Comparator, или используются в качестве ключа или некоторого такого.

0 голосов
/ 29 января 2010

SnakeYAML обрабатывает List как последовательность, а не как отображение, хотя List также имеет getter (getFirst ()). Почему вы ожидаете, что enum будет сериализован как map?

Вы должны предоставить пользовательский представитель для вывода такого необычного перечисления, как JavaBean. Тесты содержат много примеров, как написать собственный Представитель / Конструктор.

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