序列化ENUM Singleton

时间:2010-01-28 07:11:37

标签: java file serialization snakeyaml

我正在尝试将ENUM单例实例(如Joshua Bloch在他的书“Effective 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将此枚举写入文件时,我的!!com.chown.ElvisFan 'INSTANCE'文件中只有test.yaml。这就是我正在做的事情:

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 个答案:

答案 0 :(得分:4)

单身人士没有任何意义。可序列化的单身人士更没有意义。根据定义,只有一个单身人士。因此,当您对单例进行反序列化时,您将不会获得新对象。您将获得具有相同旧数据的相同旧实例。

Enums序列化是专门处理的。它们由名称和类型表示。没有其他国家得救,因为如前所述,没有任何意义。

我建议修改你的代码以避免可变的静态。

枚举不应该具有可变状态。使用单个实例序列化枚举可以在他们实现其他类(例如Comparator)时使用,或者用作键或某些类。

答案 1 :(得分:0)

SnakeYAML将List视为序列而不是映射,即使List也有getter(getFirst())。 为什么你希望将枚举序列化为map?

您必须提供一个自定义的Representer来将这种不常见的枚举转储为JavaBean。 测试包含很多如何编写自定义Representer / Constructor的示例。