2011-02-16 3 views
4
public abstract class A { 
    public string Foo{ get; set; } 
} 

public class B : A { 
    public string Marco{ get; set; } 
} 

public class C : A { 
    public string Las{ get; set; } 
} 

public class D : A { 
    public string Las{ get; set; } 
} 

public class SerializeMe { 
    [XmlElement("b", typeof(B))] 
    [XmlElement("c", typeof(C))] 
    [XmlElement("d", typeof(D))] 
    public A[] serializeProp { get; set; } 
} 

SerializeMe me = new SerializeMe(); 
me.serializeProp = new A[]{ 
          new B(){ Foo = "bar", Marco = "polo" }, 
          new C(){ Foo = "bar", Las = "Vegas" }, 
          new D(){ Foo = "bar", Las = "Vegas" } 
          }; 

XMLELEMENT 그래서이 결과 제어 XML 직렬화 속성역 직렬화 모호한 JSON은

{[ 
    {"Foo":"bar", "Marco":"polo"}, 
    {"Foo":"bar", "Las":"Vegas"}, 
    {"Foo":"bar", "Las":"Vegas"} 
]} 

그러나 xml과 달리 형식에 대한 세부 정보가 포함되어 있지 않으므로 deserialize 할 클래스를 올바르게 식별 할 수 있습니다. 기존 json 구조를 사용하여 올바르게 deserialize하는 방법이 있습니까? 아니면 json 구조를 수정해야합니까?

{[ 
    {"class":"B", 
    "object":{"Foo":"bar", "Marco":"polo"}}, 
    {"class":"C", 
    "object":{"Foo":"bar", "Las":"Vegas"}}, 
    {"class":"D", 
    "object":{"Foo":"bar", "Las":"Vegas"}} 
]} 

더 나은 방법이 있나요 : 그것은 다음과 같은 형식을 생산하도록

나는 직렬화를 무시 생각?

답변

2

당신은 중첩 된 "object"=을 떠나 단지 클래스 식별자로 유효한 속성 이름이 아니다 문자열을 사용할 수 있습니다 JSON 생성,

{"Foo":"bar", "Marco":"polo", "$Class"="B"} 

JSON.net가 내장 TypeNameHandling 기능이는 다음과 같습니다

{"$type":"Tests.MessageWrapper2, Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", 
"Headers":{"$type":"System.Collections.Hashtable, mscorlib, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089","DeliverAt":"yesterday!"}, 
"Body":{"$type":"Tests.TestMessage1, Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","Id":893239} 
} 

TypeNameHandling을 사용하는 경우 json은 임의의 유형을 구성 할 수 있습니다. 따라서 신뢰할 수없는 소스에서 json을 비 직렬화하려는 것은 아닙니다.