Pytanie Serializacja .NET WebAPI k_BackingField Nastiness


Kiedy serializuje się następujące:

[Serializable]
public class Error
{

    public string Status { get; set; }
    public string Message { get; set; }
    public string ErrorReferenceCode { get; set; }
    public List<FriendlyError> Errors { get; set; }
}

Dostaję ten odrażający bałagan:

<ErrorRootOfstring xmlns:i="http://www.w3.org/2001/XMLSchema-instance"   xmlns="http://schemas.datacontract.org/2004/07/Printmee.Api">
<_x003C_Errors_x003E_k__BackingField>
An exception has occurred. Please contact printmee support
</_x003C_Errors_x003E_k__BackingField>
<_x003C_LookupCode_x003E_k__BackingField>988232ec-6bc9-48f3-8116-7ff7c71302dd</_x003C_LookupCode_x003E_k__BackingField>
</ErrorRootOfstring>

Co daje? Jak mogę to zrobić ładnie? Odpowiedzi JSON zawierają również k_BackingField


76
2017-09-08 20:50


pochodzenie


Pomogło mi to: stackoverflow.com/questions/15388452/... - granadaCoder


Odpowiedzi:


Domyślnie nie musisz używać żadnego z nich [Serializable] ani [DataContract] do pracy z Web API.

Po prostu pozostaw model bez zmian, a Web API uszereguje wszystkie właściwości publiczne dla Ciebie.

Tylko wtedy, gdy chcesz mieć większą kontrolę nad zawartością, dekorujesz swoją klasę [DataContract] i właściwości, które należy uwzględnić [DataMember] (ponieważ zarówno DCS, jak i JSON.NET respektują te atrybuty).

Jeśli z jakiegoś powodu potrzebujesz [Serializable] na twojej klasie (tzn. serializujesz ją do strumienia pamięci z jakiegoś powodu, wykonując głębokie kopie itp.), musisz użyć obu atrybutów w połączeniu, aby zapobiec nazwom pól bazowych:

[Serializable]
[DataContract]
public class Error
{
    [DataMember]
    public string Status { get; set; }
    [DataMember]
    public string Message { get; set; }
    [DataMember]
    public string ErrorReferenceCode { get; set; }
    [DataMember]
    public List<FriendlyError> Errors { get; set; }
}

113
2017-09-10 20:46



To było to - po prostu musiałem usunąć [Serializable]. Dzięki. - Micah
Dzięki Filipie, musisz zachować atrybuty ze względu na pamięć podręczną .. BTW, jestem zagorzałym fanem Twojego bloga .. zachowaj to! - Stephen Patten
haha wielkie dzięki! - Filip W
To jest po prostu okropne. Dlaczego nie może Microsoft ZAWSZE zrobić cokolwiek poprawnego, jeśli chodzi o serializację? - Chris Marisic
Jest bardziej ogólne rozwiązanie, jak pokazałem w poniższej odpowiedzi. - JotaBe


Istnieje bardziej ogólne rozwiązanie: możesz skonfigurować Json Serializer, aby zignorować [Serializable] atrybut, dzięki czemu nie musisz zmieniać atrybutów w swoich klasach.

Powinieneś dokonać tej zmiany konfiguracji podczas uruchamiania aplikacji, tj. W Global.asax Application_Start zdarzenie:

var serializerSettings =
  GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
var contractResolver =
  (DefaultContractResolver)serializerSettings.ContractResolver;
contractResolver.IgnoreSerializableAttribute = true;

Możesz także wprowadzić inne zmiany do serializacji Json, takie jak określanie formatów do serializowania dat i wiele innych rzeczy.

Dotyczy to tylko serializacji JSON Web API. Inne serializacje w aplikacji (serializacja XML Web API, MVC JsonResult ...) nie będą miały wpływu na to ustawienie.


81
2018-03-18 16:58



To rozwiązanie pomogło mi ... dwa razy! I zapomniałem o tym między. - John Gietzen
Lubię to rozwiązanie o wiele lepiej niż dodawanie atrybutów [DataContract] i [DataMember] wszędzie. Dziękuję Ci!! - Mark Good
Wspaniale, działa jak urok! - Roemer
Nie coś, co powinieneś używać cały czas, ale jest to fajna sztuczka. Rodzaj łomu, który pomaga Ci ominąć nieprzyjemne sytuacje, w których nie masz luksusu zmiany modeli lub dogłębnej refaktoryzacji bazy kodów. - uygar.raf
Jeśli korzystasz z interfejsu API i kierujesz się do wersji 4 architektury .net, musisz zaktualizować pakiet Netwonsoft.Json, aby to działało, tj. Update-Package Newtonsoft.Json. - pblack


Spróbuj użyć DataContract zamiast Serializable, aby zaznaczyć swoją klasę. Aby uzyskać więcej szczegółów na temat tego, spójrz na to dobry blog na temat serializacji automatycznych właściwości.


2
2017-09-09 02:22