2013-04-07 94 views
1

我一直在搜索論壇和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中,但在序列化時卻忽略了它,當然,將它反序列化爲不同的類型也會失敗。

有沒有人有一個想法,爲什麼它沒有考慮到信息和反序列化到正確的類型?

+0

你有沒有試過在DeserializeObject調用中使用相同的'JsonSerializerSettings'? – 2013-04-07 18:11:50

+0

是的,在發佈問題後我嘗試了這個,但無濟於事,依然是同樣的錯誤。 – Kenneth 2013-04-07 18:13:48

+0

'DeserializeObject '中的''是什麼? – 2013-04-07 18:26:53

回答

1

我已經找到了罪魁禍首:

在我的屬性中的一個我這樣做:

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

的問題是在吸氣,我在那裏創建一個NoneAction如果obejct爲null。 顯然,Json.NET在創建MyClass對象和設置MyAction對象的值之間的某個時刻調用getter。當它看到Action-property不是null時,它會嘗試分配值而不是覆蓋整個對象。

+0

有道理。我很高興你能找到問題。 – 2013-04-07 20:31:30