1

我一直在搜索有关此问题的论坛和 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 中,但在序列化它时会忽略它,当然将其反序列化为不同的类型会失败。

有谁知道为什么它没有考虑到信息并反序列化为正确的类型?

4

1 回答 1

1

我找到了罪魁祸首:

在我的一个属性中,我正在这样做:

public MyAction Action
{
    get 
    {
        if (_Action == null) {
            Action = new NoneAction();
        }
        return _Action; 
    }
    set
    {
        if (value != _Action)
        {
            _Action = value;
            NotifyPropertyChanged("Action");
        }
    }
}

问题出在 getter 中,如果对象为空,我会在其中创建一个 NoneAction。显然,Json.NET 在创建 MyClass 对象和设置 MyAction 对象的值之间的某个时间点调用了 getter。当它看到 Action-property 不为 null 时,它会尝试分配值而不是覆盖整个对象。

于 2013-04-07T20:02:53.413 回答