【发布时间】:2013-04-07 17:54:19
【问题描述】:
我一直在搜索有关此问题的论坛和 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 中,但在序列化时会忽略它,当然将其反序列化为不同的类型也会失败。
有谁知道为什么它没有考虑到信息并反序列化为正确的类型?
【问题讨论】:
-
您是否尝试过在您的
DeserializeObject通话中使用相同的JsonSerializerSettings? -
是的,我在发布问题后立即尝试过,但无济于事,仍然是同样的错误。
-
DeserializeObject<T>中的<T>是什么? -
我在发布问题时删除了一些细节,我忘了把它拿出来,但本质上它只是 MyClass。我编辑了代码以使其更清晰。
-
我已经使用 Json.Net v4.5.11 和 .Net Framework v4.5 在 Windows 7 下运行的普通控制台应用程序中运行它。由于您没有在上面的示例中定义
ModelBase、ActionType或SettingsType,因此我不得不对代码做出一些假设。我还取出了流媒体,因为它似乎与问题无关。代码发布在这里:http://pastebin.com/RMtcjZb2。您可以尝试在 Windows Phone 8 中运行它,看看是否还有问题?
标签: json windows-phone-8 json.net