2012-11-26 13 views
7

EDIT: il momento in cui ho fatto la domanda mi thougt di provare qualcosa .. Ho impostato proprietà XMLNamespace sulla richiesta e che ha fatto il trucco ..RestSharp Deserialize ritorna proprietà vuote ma xml.deserialize test funziona

request.XmlNamespace = "http://musicbrainz.org/ns/mmd-2.0#"; 

Ma io non capisco il motivo per cui ...

problema successivo è ottenere RestSharp riconoscere atributes XML come proprietà dell'oggetto


L'ho passato per la maggior parte del weekend e non riesco a farlo funzionare.

Sto provando a scrivere un wrapper attorno a un webservice RestFul (MusicBrainz). Sto testando con un semplice esempio: ottieni i dettagli di un artista e inseriscilo in un oggetto Artist personalizzato.

quando faccio una eseguire sul RestClient si finisce male, ma le mie proprietà degli oggetti sono nulli .. Ma quando ho testare la deserializzazione con la XmlDeserializer i ObjectProperties sono riempiti (ma non per le proprietà che corrispondono a un attributo, ma io ne parleremo più avanti)

Cosa succede tra la deserializzazione della risposta e la messa dell'oggetto in response.data? Piuttosto possibile si tratta di un errore "newbie" Sto facendo come questo sono i miei primi passi con RestSharp ..

Aiuto sarebbe molto apprezzato ..

xml Returnded:

<metadata> 
    <artist type="Group" id="f1548c5b-329e-4036-921c-02213a04b525"> 
     <name>Uriah Heep</name> 
      <sort-name>Uriah Heep</sort-name> 
      <country>GB</country> 
      <life-span> 
       <begin>1970</begin> 
      </life-span> 
    </artist> 
</metadata> 

mio classe:

public class Artist 
{ 
    public int Id { get; set; } 
    public string Type { get; set; } 
    public string Name { get; set; } 
    public string SortName { get; set; } 
    public string Country { get; set; } 

} 

Nelle seguenti proprietà di output codice sono riempiti

var output = xml.Deserialize<Artist>(response); 

Ma la stessa risposta non riempie proprietà al momento della chiamata

var response = client.Execute<T>(request); 

completo del codice (ho messo il codice di prova nel metodo generico per semplicità):

public T Execute<T>(RestRequest request) where T : new() 
{ 
    var client = new RestClient(); 
    client.BaseUrl = BaseUrl; 
    client.Authenticator = null; 

    //does not fill properties 
    var response = client.Execute<T>(request); 

    if (response.ErrorException != null) 
    { 
     throw response.ErrorException; 
    } 
    var xml = new XmlDeserializer(); 

    //fills properties 
    var output = xml.Deserialize<Artist>(response); 

    return response.Data; 
} 
+1

Ho trovato una soluzione sarei interessato :-) –

+0

@ AndersBornholm. È passato molto tempo da quando ho lavorato su questo progetto. Ma per quanto riguarda la mia memoria, la "soluzione" è stata quella di impostare uno spazio dei nomi sulla richiesta RestSharp. Se sei davvero disperato, posso scavare il progetto e dare uno sguardo più da vicino ... – FasterRaf

+0

In realtà non ho lavorato su il mio progetto o per molto tempo. L'ho risolto usando qualcosa di diverso da restsharp se non ricordo male :-) –

risposta

0

Questo avviene perché il metodo Execute, dopo aver ricevuto la risposta, tenta di negoziare in base alle proprietà RootElement e XmlNamespace della richiesta e li copia da a il XmlDeserializer.

Ecco un codice from RestClient:

 handler.RootElement = request.RootElement; 
    handler.DateFormat = request.DateFormat; 
    handler.Namespace = request.XmlNamespace; 
    response.Data = handler.Deserialize<T>(raw); 

Se si passa un RestRequest con un XMLNamespace mismatching, di RestSharp XmlDeserializer (che utilizza XDocument dietro le quinte), non sarà in grado di mappare XML risposta ad una proprietà degli oggetti e otterrete invece valori predefiniti/nulli.

Ora per l'implementazione di default (quando si crea XmlDeserializer manualmente), se non si imposta un XMLNamespace, deserializzatore farà un rilevamento automatico che ignora praticamente tutti gli spazi dei nomi nella risposta e mappa tutte le proprietà solo con il loro nome .

See codice sorgente from XmlDeserializer:

 // autodetect xml namespace 
    if (!Namespace.HasValue()) 
    { 
     RemoveNamespace(doc); 
    } 

Prendendo tutti sopra in considerazione, è chiaro il motivo per cui ha iniziato a lavorare proprietà XMLNamespace dopo aver impostato esplicitamente su uno spazio dei nomi corrispondente nell'oggetto richiesta con questa linea:

 request.XmlNamespace = "http://musicbrainz.org/ns/mmd-2.0#"; 

Execute metodo copiato spazio dei nomi in deserializzatore e mappato XML per oggetto in modo appropriato.