影响BinaryFormatter反序列化的enum序号

本文关键字:enum 序号 反序列化 BinaryFormatter 影响 | 更新日期: 2023-09-27 17:54:03

我在游戏中遇到了一个奇怪的问题。

我有一个LevelHighScore类:
[System.Serializable]
public class LevelHighScores
{
    readonly Dictionary<Level, ModeScores> scores;
    // clipped out the rest for simplicity
}

带一个enum键,Level .

我最近在游戏中添加了一些新关卡,但我并没有将新关卡添加到枚举的末尾,而是按照字母顺序添加新枚举。现在,当我加载游戏时,我的新关卡有与它们相关的现有分数,这让我认为枚举的序数对序列化/反序列化有影响。

我想在将来添加关卡时避免这个问题。我也不想要记住只在enum的末尾添加级别。

是否有一种方法可以确保enum被一致地反序列化,即使在追溯添加新值时也是如此?

影响BinaryFormatter反序列化的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的答案可能是可行的。