我尝试使用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的方法而不会出现此问题吗?
谢谢..
答案 0 :(得分:3)
问题在于:
Keys.H | Keys.G
等效于:
Keys.O
虽然Keys
是一个标志枚举(因此您可以使用|
),但是您只能使用modifier键真正使用它,例如:
Shift 65536 SHIFT修改键。
所以:
Keys.H | Keys.Shift
可以,但不能:
Keys.H | Keys.G
对于您的特定情况,我建议序列化Keys
的数组。