我一直在搜索論壇和JSON.NET網站在這個問題上,從我可以看到我正確地遵循指導原則,但它無法正常工作。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:錯誤設置值 'SettingsType' 上 'Model.NoneAction'
所以,雖然類型包含在JSON中,但在序列化時卻忽略了它,當然,將它反序列化爲不同的類型也會失敗。
有沒有人有一個想法,爲什麼它沒有考慮到信息和反序列化到正確的類型?
你有沒有試過在DeserializeObject調用中使用相同的'JsonSerializerSettings'? – 2013-04-07 18:11:50
是的,在發佈問題後我嘗試了這個,但無濟於事,依然是同樣的錯誤。 – Kenneth 2013-04-07 18:13:48
'DeserializeObject'中的''是什麼? –
2013-04-07 18:26:53