Kiedy serializuję następujące elementy:
[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 obrzydliwy 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
serialization
asp.net-web-api
Micheasza
źródło
źródło
Odpowiedzi:
Domyślnie nie musisz używać
[Serializable]
ani[DataContract]
pracować z Web API.Po prostu pozostaw model bez zmian, a interfejs API sieci Web będzie serializował wszystkie właściwości publiczne.
Tylko jeśli chcesz mieć większą kontrolę nad zawartością, możesz ozdobić swoją klasę
[DataContract]
i właściwości, które mają być uwzględnione[DataMember]
(ponieważ zarówno DCS, jak i JSON.NET respektują te atrybuty).Jeśli z jakiegoś powodu potrzebujesz
[Serializable]
swojej klasy (tj. Z jakiegoś powodu serializujesz ją do strumienia pamięci, robisz głębokie kopie itp.), Musisz użyć obu atrybutów w połączeniu, aby zapobiec nazwom pól zapasowych:źródło
Istnieje bardziej ogólne rozwiązanie: możesz skonfigurować Json Serializer tak, aby ignorował
[Serializable]
atrybut, dzięki czemu nie musisz zmieniać atrybutów w swoich klasach.Tę zmianę konfiguracji należy wprowadzić przy starcie aplikacji, czyli w
Application_Start
zdarzeniu Global.asax :Możesz również wprowadzić inne zmiany w serializacji Json, takie jak określanie formatów serializacji dat i wiele innych rzeczy.
Dotyczy to tylko serializacji JSON interfejsu API sieci Web. Inne serializacje w aplikacji (serializacja XML interfejsu API sieci Web, MVC JsonResult ...) nie będą miały wpływu na to ustawienie.
źródło
Update-Package Newtonsoft.Json
.Spróbuj użyć DataContract zamiast Serializable do oznaczania swojej klasy. Aby uzyskać więcej informacji na temat przyczyn, zapoznaj się z tym dobrym wpisem na blogu dotyczącym serializacji właściwości automatycznych.
źródło
Atrybuty [DataContract] nie działały dla mnie, więc nie było takiej opcji.
XmlSerializer ignoruje [XmlAttribute] w WebApi
Powyższa rezolucja rozwiązała to za mnie.
źródło