2010-08-18 27 views
4

我有一個簡單的類層次結構。 Foo是基類。 Bar和Baz是從Foo繼承而來的。這些類的實例存儲在List中。我必須將列表序列化爲JSON。它工作得很好。但問題是將其反序列化回列表<>。如何用Json.NET重建我的類層次結構?

我把Foos,Bars和Bazs放入列表中,序列化它,當我反序列化它時,我只得到Foos :)但我想要我的酒吧和Bazs。用Json.NET可以嗎?

using System; 
using System.Collections.Generic; 

using Newtonsoft.Json; 

namespace JsonTest 
{ 
    class Foo 
    { 
    int number; 

    public Foo(int number) 
    { 
     this.number = number; 
    } 

    public int Number 
    { 
     get { return number; } 
     set { number = value; } 
    } 
    } 

    class Bar : Foo 
    { 
    string name; 

    public Bar(int number, string name) 
     : base(number) 
    { 
     this.name = name; 
    } 

    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 
    } 

    class Baz : Foo 
    { 
    float time; 

    public Baz(int number, float time) 
     : base(number) 
    { 
     this.time = time; 
    } 

    public float Time 
    { 
     get { return time; } 
     set { time = value; } 
    } 
    } 

    class Program 
    { 
    static void Main(string[] args) 
    { 
     List<Foo> fooList = new List<Foo>(); 
     fooList.Add(new Foo(123)); 
     fooList.Add(new Bar(123, "Hello, world")); 
     fooList.Add(new Baz(123, 0.123f)); 

     string json = JsonConvert.SerializeObject(fooList, Formatting.Indented); 
     List<Foo> fooList2 = JsonConvert.DeserializeObject<List<Foo>>(json); 
     // Now I have only Foos in the List 
    } 
    } 
} 

回答

0

您正在序列化Foos列表而不是Baz和Bars列表。
我認爲最簡單的解決方案來保持你的邏輯將是序列化Baz和酒吧列表和concat列表(這隻會工作,如果你可以住不同的順序)。
通常,使用這種設計看起來並不自然。最好讓一個類具有不同的構造函數,並在字段不適用時使用null。

+1

嗯...... Bar和Baz的所有字段都被序列化爲JSON。在調用JsonConvert.SerializeObject之後,JSON中有Bar的名稱字段和Baz的時間字段。只有反過來才行。反序列化JSON給了我三個Foos。它只是忽略了巴爾和巴茲特有的領域。 我認爲可能有一個聰明的技巧(如屬性)與Json.NET保持我的類層次結構。 – 2010-08-19 07:00:18