2014-07-10 5 views
3

Json.Net을 사용하고 여러 유형의 객체가 포함 된 목록을 직렬화 및 비 직렬화하려고합니다. 내 파생 된 형식의 개체를 포함하는 List로 끝나는 방법을 찾기 위해 고심하고 있습니다. 대신 기본 형식의 목록으로 끝납니다.Json.net을 사용하여 혼합 유형 목록 비 직렬화

내 코드 예제하게 그것을 무슨 일이 일어나고 있는지 꽤 명확 :

public class Vehicle{ 
    public int wheels = 4; 
} 
public class Truck : Vehicle { 
    public int airhorns = 1; 
} 

static void Main (string[] args) { 

    List<Vehicle> vehicles = new List<Vehicle>(); 
    vehicles.Add (new Vehicle()); 
    vehicles.Add (new Truck()); 
    foreach (Vehicle v in vehicles) { 
     Console.WriteLine ("Before deserializing, we have a: " + v.GetType()); 
    } 

    string s = JsonConvert.SerializeObject (vehicles); 
    List<Vehicle> deserialized = JsonConvert.DeserializeObject<List<Vehicle>> (s); 
    foreach (Vehicle v in deserialized) { 
     Console.WriteLine ("After deserializing, we have a: " + v.GetType()); 
    } 
} 

을 그리고이 실행 결과는 다음과 같습니다

Before deserializing, we have a: Vehicle 
Before deserializing, we have a: Truck 
After deserializing, we have a: Vehicle 
After deserializing, we have a: Vehicle 

나는 내 직렬화 복원의 트럭으로 끝낼 싶습니다 명부. 한 가지주의 할 점은 문자열 "s"의 json은 airhorn 변수를 포함한다는 것입니다. 그래서 그 데이터가 있습니다.

JSON 문서를 살펴본 결과 내가 찾고있는 것을 찾지 못했습니다. CustomCreationConverters (http://james.newtonking.com/json/help/index.html?topic=html/CustomCreationConverter.htm)를 해킹 해 보았는데 올바른 파생 클래스를 인스턴스화하는 데 잠재적으로 사용될 수있는 것처럼 보였지만 해당 메서드는 json 데이터를 제공하지 않으므로 형식을 결정할 수 없습니다.

"Class : Vehicle"또는 "Class : Truck"을 명시 적으로 정의 할 수있는 다른 필드를 추가 할 의향이 있지만 아직 사용 방법을 모르겠습니다. 어쩌면 올바른 클래스를 만든 후에는 새 객체에서 JsonConvert.PopulateObject를 사용할 수 있지만 json 파편을 처리해야합니다.

아이디어가 있으십니까? 감사!

답변

1

TypeNameHandling으로 설정하고이 설정을 직렬화와 직렬화 해제에 모두 사용하십시오.

var settings = new JsonSerializerSettings() { 
        TypeNameHandling = Newtonsoft.Json.TypeNameHandling.All 
       }; 

string s = JsonConvert.SerializeObject(vehicles, settings); 
List<Vehicle> deserialized = JsonConvert.DeserializeObject<List<Vehicle>>(s,settings); 

foreach (Vehicle v in deserialized) 
{ 
    Console.WriteLine("After deserializing, we have a: " + v.GetType()); 
} 

출력 :

Before deserializing, we have a: SO3.Form1+Vehicle 
Before deserializing, we have a: SO3.Form1+Truck 
After deserializing, we have a: SO3.Form1+Vehicle 
After deserializing, we have a: SO3.Form1+Truck 
+1

오 와우, 나는 그 옵션을 전혀 보지 않았다. 완벽 해, 고마워! –

관련 문제