2010-01-28 33 views
1

我試圖序列化一個ENUM單例實例(如Joshua Bloch在他的書Effective Java中所述)到一個文件中。枚舉實例是一個簡單的JavaBean,因爲這:序列化ENUM Singleton

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"); 

有人可以請指導我在此。謝謝!

將帖子

碼校正。

+1

枚舉不應該有狀態。你在枚舉中只有一個值。看起來你正在使用錯誤的工具來完成這項工作。你不是隻想要一個普通的單身人士嗎?你不能不使用單身人士嗎? – abyx 2010-01-28 08:26:32

+0

你說得對。我同意Enum應該是無狀態的,但我只是試着去看看我是否偶然發現過這種枚舉,可能是序列化文件的方式。請注意,我不是在「這是一個很好的設計實踐」的時尚問題。我只是問「我該怎麼做?」將這個類轉換爲非枚舉單例類並不難,所以總的來說,如果你得到這樣的類,你會如何寫入一個文件? – ashokgelal 2010-01-28 08:37:34

+0

SnakeYAML將枚舉視爲標量。 (除非你強制它使用JavaBeanDumper中的映射節點) 你必須提供一個自定義的Representsenter來轉儲JavaBean這樣的異常枚舉。 – Andrey 2010-01-28 11:05:13

回答

4

單身不會讓人覺得有意義。可串行化的單例變得更沒有意義。根據定義,只有一個單身人士。所以當你對一個單例進行反序列化時,你不會得到一個新的對象。您將獲得舊數據相同的舊實例。

枚舉序列化是專門處理的。它們由名稱和類型來表示。沒有其他國家得救,因爲如前所述,這沒有任何意義。

我建議修改您的代碼以避免可變靜態。

枚舉不應該有可變狀態。使用單個實例對枚舉進行序列化可以在他們實現某個其他類(如Comparator)的地方有意義,或者可以用作關鍵字或其他類。

+0

這就是我需要達到的 - 相同的舊數據和相同的舊實例。我非常確定數據可以保存,因爲snakeyaml文檔提供了有關轉儲/加載枚舉數據的類似示例:http://code.google.com/p/snakeyaml/wiki/Documentation#Enum – ashokgelal 2010-01-28 07:57:21

+0

哪個舊實例?存在的舊實例,或者不是以序列化形式存在的舊「實例」。 – 2010-01-28 08:58:52

0

SnakeYAML將List視爲序列,而不是作爲映射,即使List也有getter(getFirst())。 你爲什麼期望枚舉被序列化爲map?

您必須提供一個自定義的Representsenter才能將這樣一個不尋常的枚舉轉儲爲JavaBean。 測試包含大量示例如何編寫自定義的Representsenter/Constructor。