C# 为什么我错误地使用了KnownType属性?

C# 为什么我错误地使用了KnownType属性?,c#,wcf,serialization,datacontract,C#,Wcf,Serialization,Datacontract,我正在尝试从google api反序列化json响应,所以我想我应该定义几个类来帮助它: [DataContract] public class DetectionResult:ResponseData { [DataMember(Name="language")] public string Language { get; set; } [DataMember(Name="isReliable")] public bool IsReliable

我正在尝试从google api反序列化json响应,所以我想我应该定义几个类来帮助它:

[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类并正确地反序列化它?

您是否尝试将KnownType属性放在ResponseData而不是RequestResult上?

在该代码示例中,您需要[KnownType(typeof(DetectionResult))]作为ResponseData的属性而不是RequestResult


我不知道这是否足以解决您的问题

在您的回复数据中,无法推断具体类型。响应中未指定要反序列化的类型

从MSDN:

要保留类型标识,将复杂类型序列化为JSON时 可以添加“类型提示”,反序列化程序识别提示和 行动得体。“类型提示”是带有 “类型”的关键字名称(两个下划线,后跟单词“类型”)。 该值是JSON字符串的形式 “DataContractName:DataContractNamespace”(第一个 冒号是名称)。使用前面的示例,“圆”可以是 序列化如下


请参阅与多态性相关的部分。

根据我使用DataContractSerializer和XmlSerializer的经验,当序列化过程中遇到意外类型时,这些序列化程序会抛出异常;他们不仅仅是尽了最大的努力。也许DataContractJsonSerializer根本不支持KnownTypes。

很棒的链接!非常感谢你找到它。