[英]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.