使用 json 对具有标志属性的枚举进行序列化和反序列化



我尝试使用 JSON 序列化我的模型对象。我这样做没有问题,我知道如何反序列化它,但在这种情况下,我没有得到我预期的结果。我将给出我的模型类和一个例子。

这是我的课

public class ShortcutsModel
{
public string shortcutName { get; set; } = string.Empty;
public ModifierKeys modifierKeys { get; set; }
public Keys keys { get; set; }
}

ModifierKeys 和 Keys 都是枚举,它们都有 flags 属性。ModifierKeys 是自定义的,键是 Forms 命名空间中的键。无论如何,我像这样填充我的对象:

ShortcutsModel scm = new ShortcutsModel();
scm.shortcutName = "Load";
cm.modifierKeys = Models.Enums.ModifierKeys.Control | Models.Enums.ModifierKeys.Alt;
scm.keys = Keys.H | Keys.G;

没有任何问题,之后我在我的属性集中像这样序列化它:

string JsonString = JsonConvert.SerializeObject(value);

我得到了 JSON 字符串。它看起来像这样:

{"shortcutName":"Load","modifierKeys":3,"keys":79}

到目前为止没有问题。我保存了这个值,并希望在保存时将其取回,但是当我像这样反序列化它时:

ShortcutsModel ReturningValue = JsonConvert.DeserializeObject<ShortcutsModel>(JSONString);

我没有得到与序列化相同的对象。反序列化类实例的 keys 属性后,向我显示 Keys.O,这是错误的,因为我序列化它时它是 H+G。

我不确定为什么会发生这种情况,但我认为这是因为我的自定义枚举扩展了 uint,但默认的 Keys 枚举没有。有人可以为我提供一种在没有此问题的情况下反序列化我的 JSON string 的方法吗?

谢谢。。

问题是:

Keys.H | Keys.G

相当于:

Keys.O

虽然Keys是一个标志枚举(因此您可以使用|),但您只能将其与修饰键一起使用,例如:

Shift 65536 SHIFT 修饰键。

所以:

Keys.H | Keys.Shift

会很好,但不是:

Keys.H | Keys.G

对于您的特定上下文,我建议序列化一组Keys

最新更新