我正在尝试将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");
有人可以指导我这个。谢谢!
[编辑]
代码更正。
答案 0 :(得分:4)
单身人士没有任何意义。可序列化的单身人士更没有意义。根据定义,只有一个单身人士。因此,当您对单例进行反序列化时,您将不会获得新对象。您将获得具有相同旧数据的相同旧实例。
Enums序列化是专门处理的。它们由名称和类型表示。没有其他国家得救,因为如前所述,没有任何意义。
我建议修改你的代码以避免可变的静态。
枚举不应该具有可变状态。使用单个实例序列化枚举可以在他们实现其他类(例如Comparator
)时使用,或者用作键或某些类。
答案 1 :(得分:0)
SnakeYAML将List视为序列而不是映射,即使List也有getter(getFirst())。 为什么你希望将枚举序列化为map?
您必须提供一个自定义的Representer来将这种不常见的枚举转储为JavaBean。 测试包含很多如何编写自定义Representer / Constructor的示例。