【问题标题】:Ordinal of enum affecting BinaryFormatter deserialization?影响 BinaryFormatter 反序列化的枚举序数?
【发布时间】:2016-07-03 01:44:56
【问题描述】:

我在游戏中遇到了一个关于乐谱序列化的奇怪问题。

我有一个 LevelHighScore 课程:

[System.Serializable]
public class LevelHighScores
{
    readonly Dictionary<Level, ModeScores> scores;
    // clipped out the rest for simplicity
}

使用枚举键,Level

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

我想在以后添加关卡时避免这个问题。我也不想记住只在枚举末尾添加级别。

有没有办法确保枚举始终被反序列化,即使在追溯添加新值时也是如此?

【问题讨论】:

  • 使用Dictionary&lt;String, ModeScores&gt; 代替级别键控字典似乎是一种有效的解决方法。尽管它失去了枚举的类型安全性。很想听听其他建议。
  • 您可以显式分配枚举值,因此顺序无关紧要。见stackoverflow.com/questions/1681285/…
  • @dbc,这是个好建议,您应该将其扩展为答案

标签: c# serialization enums binary-serialization


【解决方案1】:

[DataContract] 属性添加到枚举并使用DataContractSerializer 进行序列化。在单个值上放置 [EnumMember] 属性。

这将导致值按名称序列化,而不是按数值。

为了确保我会测试序列化到一个文件(或者如果它是 XML 序列化,则为一个字符串)并查看它存储的内容以确保它可以工作,并确保它还没有按名称序列化。否则你将无法确定是不是这个原因。

【讨论】:

  • Looking into this further,这看起来是个不错的解决方案。不幸的是,Unity 默认不支持 DataContracts。看起来您可以导入 System.Runtime.Serialization.dll 来添加它,但我不确定这是否是我特定项目的最佳解决方案。
【解决方案2】:

我最终关注dbc's suggestion 并向枚举添加显式值。

所以,我将 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's answer 可能是要走的路。

【讨论】:

    猜你喜欢
    • 2019-05-31
    • 2015-07-26
    • 1970-01-01
    • 2021-11-30
    • 2014-08-10
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 2012-08-12
    相关资源
    最近更新 更多