4

私はグーグル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クラスについて知って、適切に逆シリアル化する必要がありますか?

4

4 に答える 4

11

応答データでは、具象型を推測する方法がありません。逆シリアル化する型が応答で指定されていません。

MSDN から:

型の同一性を保持するために、複雑な型を JSON にシリアル化するときに「型ヒント」を追加できます。デシリアライザーはヒントを認識して適切に動作します。「型ヒント」は、キー名が「__type」(2 つのアンダースコアの後に「type」という単語が続く) の JSON キーと値のペアです。値は、"DataContractName:DataContractNamespace" の形式の JSON 文字列です (最初のコロンまでが名前です)。前の例を使用すると、"Circle" は次のようにシリアル化できます。

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

ポリモーフィズムに関連するセクションを参照してください。

于 2009-11-18T21:34:38.903 に答える
1

RequestResultの代わりにKnownType属性をResponseDataに配置してみましたか?

于 2009-11-18T21:26:19.120 に答える
1

そのコードサンプルでは、​​[KnownType(typeof(DetectionResult))]をRequestResultではなくResponseDataの属性にする必要があります。

それがあなたの問題を解決するのに十分かどうかはわかりません

于 2009-11-18T21:29:22.723 に答える
0

DataContractSerializer と XmlSerializer を使用した私の経験から、シリアル化プロセス中に予期しない型が検出されると、これらのシリアライザーは例外をスローします。彼らは単に最善を尽くすだけではありません。おそらく、DataContractJsonSerializer は KnownTypes をまったくサポートしていません。

于 2009-11-18T22:59:03.197 に答える