繁体   English   中英

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

[英]Serializing and deserializing enum with flag attribute using 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是自定义的,而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的方法吗?

谢谢..

问题是:

Keys.H | Keys.G

等效于:

Keys.O

虽然Keys是一个标志枚举(因此你可以使用| ),你真的只能与使用它修改键,如:

Shift 65536 SHIFT修改键。

所以:

Keys.H | Keys.Shift

会很好,但不是:

Keys.H | Keys.G

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM