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