我一直在搜索有关此问题的论坛和 JSON.NET 网站,据我所知,我正确地遵循了指南,但它无法正常工作。
我正在尝试从派生类中反序列化对象。序列化工作正常,但是在反序列化时它会尝试反序列化为错误的类型。
我正在尝试使用 Windows Phone 8 和 JSON.NET 4.5.11
我有以下要序列化的类:
public class MyClass : ModelBase
{
public string Title { get; set; }
[JsonProperty(TypeNameHandling = TypeNameHandling.All)]
public MyAction Action {get; set; }
}
public abstract class MyAction : ModelBase
{
[JsonIgnore()]
public abstract ActionType ActionType { get; }
public abstract void Execute();
}
public class SettingsAction : MyAction
{
public override ActionType ActionType
{
get { return ActionType.Settings; }
}
public SettingsType SettingsType {get; set; }
public override void Execute()
{
}
}
public class NoneAction : MyAction
{
public override ActionType ActionType
{
get { return ActionType.None; }
}
public override void Execute()
{
return;
}
}
我像这样序列化它:
MyClass obj = new MyClass
{
Action = new SettingsAction()
};
string json = JsonConvert.SerializeObject(
obj,
Formatting.Indented,
new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All });
using (StreamWriter writer = new StreamWriter(stream))
{
writer.Write(json);
}
它给了我以下 JSON:
{
"$type": "Model.MyClass, Model",
"Title": null,
"Action": {
"$type": "Model.SettingsAction, Model",
"SettingsType": 0
}
}
据我所知,这是正确的,我告诉它包含类型信息并且它被正确包含。
我像这样反序列化它:
using (StreamReader r = new StreamReader(stream))
{
string json = r.ReadToEnd();
MyClass obj = JsonConvert.DeserializeObject<MyClass>(json);
}
我收到以下错误:
JsonSerializationException:在“Model.NoneAction”上将值设置为“SettingsType”时出错
因此,尽管该类型包含在 JSON 中,但在序列化它时会忽略它,当然将其反序列化为不同的类型会失败。
有谁知道为什么它没有考虑到信息并反序列化为正确的类型?