我尝试使用 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
。