2010-08-18 3 views
4

나는 간단한 클래스 계층 구조를 가지고있다. Foo는 기본 클래스입니다. Bar와 Baz는 Foo에서 상속받습니다. 이러한 클래스의 인스턴스는 목록에 저장됩니다. 목록을 JSON에 직렬화해야한다. 그것은 꽤 잘 작동합니다. 그러나 문제는 그것을 목록으로 다시 deserialising입니다 <>.Json.NET으로 클래스 계층 구조를 재 작성하는 방법은 무엇입니까?

나는 Foos, Bars, Bazs를 목록에 넣고 그것을 직렬화하고 그것을 역 직렬화 할 때 나는 단지 Foos 만 얻는다. 나는 나의 막대와 바즈를 원한다. 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와 Bars의 목록을 직렬화하고 목록을 연결하는 것입니다 (다른 순서로 살 수있는 경우에만 작동 함).
일반적으로이 디자인으로 작업하는 것이 자연스럽지 않습니다. 다른 생성자를 가진 하나의 클래스를 갖는 것이 좋을 것이며 필드가 적용 가능하지 않을 때 null을 사용하는 것이 좋습니다.

+1

흠 ... Bar와 Baz의 모든 필드는 JSON으로 직렬화됩니다. JsonConvert.SerializeObject를 호출 한 후 Bar의 이름 필드와 Baz의 시간 필드가 JSON에 있습니다. 다른 방법으로는 작동하지 않습니다. JSON을 비 직렬화하면 3 개의 Foos를 얻을 수 있습니다. Bar 및 Baz와 관련된 필드는 무시됩니다. 클래스 클래스를 유지하기 위해 Json.NET에서 영리한 트릭 (속성과 같은)이있을 수 있다고 생각했습니다. –

관련 문제