我在游戏中遇到了一个奇怪的问题。
我有一个LevelHighScore类:[System.Serializable]
public class LevelHighScores
{
readonly Dictionary<Level, ModeScores> scores;
// clipped out the rest for simplicity
}
带一个enum键,Level
.
我最近在游戏中添加了一些新关卡,但我并没有将新关卡添加到枚举的末尾,而是按照字母顺序添加新枚举。现在,当我加载游戏时,我的新关卡有与它们相关的现有分数,这让我认为枚举的序数对序列化/反序列化有影响。
我想在将来添加关卡时避免这个问题。我也不想要记住只在enum的末尾添加级别。
是否有一种方法可以确保enum被一致地反序列化,即使在追溯添加新值时也是如此?
将[DataContract]
属性添加到枚举中,并使用DataContractSerializer
进行序列化。在单个值上放置一个[EnumMember]
属性。
这将导致值按名称序列化,而不是按数值序列化。
为了确保,我将测试序列化到一个文件(或一个字符串,如果它是XML序列化),看看它存储什么,以确保它工作,并确保它没有已经序列化的名称。否则你将无法确定这是否是原因。
我最终按照dbc的建议,在枚举中添加了显式的值。
因此,我将Level从
public enum Level
{
Aquarium,
Crescendo,
HungarianDance,
MapleLeafRag,
}
// NOTE: the numbers here don't represent order,
// they are just to ensure proper serialization
public enum Level
{
AmazingPlan = 4, // new level
Aquarium = 0,
Crescendo = 1,
HungarianDance = 2,
MapleLeafRag = 3,
}
这是我的问题的一个很好的简单解决方案,尽管我认为对于非unity项目Scott Hannen的答案可能是可行的。