2009-11-18 3 views
4

가 나는 구글 API에서 JSON 응답을 역 직렬화하기 위해 노력하고, 그래서 나는 그것으로 도움이되는 몇 가지 클래스를 정의하는 것이라고 생각 :KnownType 속성을 잘못 사용하는 이유는 무엇입니까?

[DataContract] 
public class DetectionResult:ResponseData 
{ 
    [DataMember(Name="language")] 
    public string Language 
    { get; set; } 

    [DataMember(Name="isReliable")] 
    public bool IsReliable 
    { get; set; } 

    [DataMember(Name="confidence")] 
    public double Confidence 
    {get;set;} 
} 

[DataContract] 
public abstract class ResponseData 
{ 

    [DataMember(Name = "error")] 
    public TranslationError Error 
    { get; set; } 

} 

[DataContract] 
public class TranslationError 
{ 
    [DataMember(Name="code")] 
    public int Code 
    { get; set; } 

    [DataMember(Name="message")] 
    public int Message 
    { get; set; } 
} 


[DataContract] 
[KnownType(typeof(DetectionResult))] 
public class RequestResult 
{ 
    [DataMember(Name="responseStatus")] 
    public int ResponseStatus 
    { get; set; } 

    [DataMember(Name="responseDetails")] 
    public string ResponseDetails 
    { get; set; } 

    [DataMember(Name = "responseData")] 
    public ResponseData Response 
    { get; set; } 
} 

내가 요청을 한 후 얻을 응답은 다음과 같습니다

{"responseData": {"language":"en","isReliable":false,"confidence":0.114892714}, "responseDetails": null, "responseStatus": 200} 

하고 역 직렬화하는이 코드를 사용 :

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    using (Stream stream = response.GetResponseStream()) 
     { 
      DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(RequestResult)); 

      RequestResult result = (RequestResult)serializer.ReadObject(stream);     

      stream.Close(); 
     } 

을 그러나 "는 추상 클래스를 만들 수 없습니다"라는 예외를 얻고있다. 그것은 DetectionResult 클래스에 대해 알고 그것을 제대로 deserialize 할 수 있습니까?

답변

11

구체적인 유형을 추론 할 수있는 방법이 없기를 해결하기 위해 충분한 있는지 모르겠다. deserialize 할 형식이 응답에 지정되어 있지 않습니다. MSDN에서

하십시오 "타입 힌트"를 JSON으로 복잡한 유형을 직렬화 할 때

유형의 정체성을 유지하려면, 추가 할 수 및 디시리얼라이저는 힌트 적절 행위를 인식합니다. "유형 힌트"는 키 이름이 "__type"인 두 개의 밑줄과 "type"이라는 단어가있는 JSON 키/값 쌍입니다. 이 값은 "DataContractName : DataContractNamespace"형식의 JSON 문자열입니다 (첫 번째 문자는 입니다). 앞의 예제를 사용하면 "Circle"은 이 될 수 있습니다.

http://msdn.microsoft.com/en-us/library/bb412170.aspx

는 다형성에 관한 섹션을 참조하십시오.

+0

굉장 링크! 그것을 찾아 주셔서 대단히 감사합니다. –

1

RequestResult 대신 ResponseData에 KnownType 특성을 넣으려고 했습니까?

1

해당 코드 샘플에서는 [KnownType (typeof (DetectionResult))]가 RequestResult가 아닌 ResponseData의 속성이되어야합니다.

그 문제를 귀하의 응답 데이터에

+1

Ive도이를 시도했으며 동일한 예외가 발생합니다. –

0

DataContractSerializer 및 XmlSerializer에서 작업 한 경험으로 직렬화 프로세스 중에 예기치 않은 유형이 충족되면 해당 serializer에서 예외가 발생합니다. 그들은 단순히 그들이 할 수있는 최선을 다하지 않습니다. DataContractJsonSerializer가 KnownTypes를 전혀 지원하지 않을 수도 있습니다.

관련 문제