1

我正在尝试将 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");

有人可以指导我吗?谢谢!

[已编辑]

代码更正。

4

2 回答 2

4

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

枚举序列化是专门处理的。它们由名称和类型表示。没有其他状态被保存,因为如前所述,这没有任何意义。

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

枚举不应具有可变状态。使用单个实例序列化枚举在它们实现其他一些类(例如Comparator,或用作键或类似的东西)的情况下是有意义的。

于 2010-01-28T07:51:23.120 回答
0

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

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

于 2010-01-28T21:09:51.707 回答