2016-07-18 8 views
1

Die HTTP-Antwort (text/xml):Wie verwende ich RestSharp, um Klassenhierarchien zu deserialisieren?

<results> 
    <status code="ok"/> 
    <OWASP_CSRF_TOKEN> 
    <token>db8288c2e01a6e0caa5a9b52cc4570040b2714cc7a1f589670d6606d486ab98e</token> 
    </OWASP_CSRF_TOKEN> 
</results> 

Mein C# Objekte:

[DeserializeAs(Name = "results")] 
public class Response 
{ 
    [DeserializeAs(Name = "status")] 
    public ResultStatus Status { get; set; } 

    public struct ResultStatus 
    { 
     [DeserializeAs(Name = "code")] 
     public string Code { get; set; } 
    } 
} 

internal class AuthenticationResponse : Response 
{ 
    [DeserializeAs(Name = "OWASP_CSRF_TOKEN")] 
    internal OWaspCsrfToken CsrfToken { get; set; } 

    internal struct OWaspCsrfToken 
    { 
     [DeserializeAs(Name = "token")] 
     internal string Token { get; set; } 
    } 
} 

Das hier Ziel ist es, haben RestSharp die HTTP-Antwort auf Objekte in Code deserialisieren. Aus irgendeinem Grund wird jedoch nur die Code -Eigenschaft des Ergebnisstatus richtig festgelegt. Die Token Eigenschaft ist immer null. Wie können Objekte in Klassenhierarchien wie diesem deserialisiert werden?

Antwort

0

Das Problem ist mit der Verwendung von internal. Meine Vermutung ist, dass Eigenschaften, Klassen und Methoden, die mit internal markiert sind, nicht einmal zur Laufzeit mit Reflektion richtig erkannt werden können. Oder, wenn es möglich ist, könnte RestSharp ein Problem haben, das dies richtig macht. In jedem Fall funktioniert das:

public class AuthenticationResponse : Response 
{ 
    [DeserializeAs(Name = "OWASP_CSRF_TOKEN")] 
    public OWaspCsrfToken CsrfToken { get; set; } 

    public struct OWaspCsrfToken 
    { 
     [DeserializeAs(Name = "token")] 
     public string Token { get; set; } 
    } 
} 

EDIT: Eigentlich bin ich ziemlich sicher, dass Reflexion die internen Methoden sehen kann. Das Problem bestand darin, dass RestSharp die set-Methode für keine der internen Eigenschaften aufrufen konnte.

Verwandte Themen