使用json对带有flag属性的枚举进行序列化和反序列化

时间:2019-07-26 12:18:33

标签: c# json.net

我尝试使用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是自定义的,而key是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枚举却没有。有人可以为我提供一种反序列化我的JSONString的方法而不会出现此问题吗?

谢谢..

1 个答案:

答案 0 :(得分:3)

问题在于:

Keys.H | Keys.G

等效于:

Keys.O

虽然Keys是一个标志枚举(因此您可以使用|),但是您只能使用modifier真正使用它,例如:

  

Shift 65536 SHIFT修改键。

所以:

Keys.H | Keys.Shift

可以,但不能:

Keys.H | Keys.G

对于您的特定情况,我建议序列化Keys的数组。