Estensione della serializzazione del restosharp con un problema di serializzatore personalizzato

StackOverflow https://stackoverflow.com//questions/25066992

Domanda

Sto cercando di migliorare la serializzazione dei restsharp predefinita utilizzando JSON.NET Library. Per personalizzare la serializzazione è necessario implementare l'interfaccia Iserializer:

public class LowerCaseSerializer : ISerializer{
    public LowerCaseSerializer(){
        ContentType = "application/json";
    }

    public string Serialize(object obj){
         var settings = new JsonSerializerSettings{
            ContractResolver = new LowerCaseResolver()
        };
        return JsonConvert.SerializeObject(obj, Formatting.None, settings);
    }

    string ISerializer.RootElement { get; set; }
    string ISerializer.Namespace { get; set; }
    string ISerializer.DateFormat { get; set; }
    public string ContentType { get; set; }
}
.

Come vedi che sto anche estendendo il contractresolver. Questo è il codice attuale che fa la ridotta:

public class LowerCaseResolver : DefaultContractResolver{
    protected override string ResolvePropertyName(string propertyName){
        return propertyName.ToLower();
    }
}
.

Una volta tutto ciò che è installato, posso usarlo con restsharp:

var request = new RestRequest(url, method);
if (ShouldAddBody(method)){
    request.JsonSerializer = new LowerCaseSerializer();
    request.AddObject(body);
}
var response = client.Execute<T>(request);
.

Tutto funziona, tranne le proprietà non sono in minuscolo. Quando il debug del debugger entra nel costruttore dei serializzatori, ma il metodo non viene mai chiamato. Quando ho provato esattamente lo stesso per le deserializations (interfaccia IDESeriaLize, che si attacca al client) è stato chiamato il metodo per l'involucro inferiore per ogni proprietà.

Quello che ho anche provato:

request.RequestFormat = DataFormat.Json;  // no change
// this correctly lower cases the properties
var json = new LowerCaseSerializer().Serialize(body);
// wrong request sent to the server, it tells me that some property is missing
request.AddBody(json);
// the exact same thing with this
request.AddParameter("application/json", json, ParameterType.RequestBody);
.

La cosa che ho notato con gli ultimi due: se ho proprietà minuscole e lascia che il restosharp serializzasse, la richiesta ha 5 parametri (uno per ogni proprietà). Se lo aggiungo tramite due metodi superiori ha solo una proprietà e questo è il tutto JSON.

Controllo i problemi di restosharp inutili. Qualche suggerimento?

Aggiornamento:

Questo molto strano:

    .
  • biforculato il restosharp, installato json.net, funziona bene
  • Copied Restrequest Class da RestSharp Fork, incollato alla mia applicazione, ha usato, funziona bene
  • ha iniziato il nuovo progetto, installato RestSharp e JSON.NET tramite Package Manager, funziona FINE

Quindi rimosso tutti i pacchetti dalla mia applicazione principale, redownload, non funziona. Kinda rinunciare a questo.

Aggiornamento 2: Debug Attraverso la versione biforcuta ho notato questo: la richiestaFormat deve essere dataformat.json o userà il serializzatore XML. Ma questo non risolve il problema. Ho provato a impostare entrambi (ci sono solo due) serializzatori a null:

request.JsonSerializer = null;
request.XmlSerializer = null;
.

Nel nuovo progetto ho fatto ciò causa NullReferreencexception come previsto. Ma nel vecchio non succede nulla. Ho provato a rinominare le variabili, rendendo un'altra variabile dello stesso tipo, ma non è nulla. Sembra che nel progetto abbia la classe RESTREQUEST è in qualche modo bugged.

Ho anche aggiunto un nuovo progetto alla soluzione. E anche lì il codice funziona. Quindi è solo un progetto che ha il problema.

È stato utile?

Soluzione

Poiché non puoi riprodurlo in un nuovo progetto, ci deve essere qualcosa di diverso in corso in questo particolare progetto, che sta causando i problemi, stai descrivendo.

Un paio di cose che potresti provare (in nessun ordine particolare):

    .
  • Verifica che tu stia usando la stessa esatta versione della libreria in entrambi i progetti (quella che funziona e quella che non): versione del pacchetto e piattaforma di destinazione (net4, net35 ...).

  • Elimina la cartella packages del tuo progetto non funzionante in modo che la Nuget sarà costretta a scaricare tutti i pacchetti.

  • Ricerca il percorso esatto per la biblioteca di riferimento nella finestra Proprietà di Visual Studio quando si dispone di restsharp dal nodo dei riferimenti selezionato. Fai un paragone binario tra le biblioteche referenziate dal funzionamento e dal progetto non funzionante.

  • Purtroppo non c'è pacchetto di simboli per restsharp su SymboSource , così tu Non è possibile eseguire direttamente il debug di restsharp nel tuo progetto non funzionante. È possibile utilizzare riflettore.net vspro se hai la licenza o non ho mai usato il processo prima.

  • Sposta parti del tuo progetto non funzionante a quello che lavora fino a quando non si ferma a funzionare.

Modifica:

Guardando il codice sorgente di RestRequest, AddObject Non sembra usare il JsonSerializer che stai impostando. Hai provato ad usare invece AddBody?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top