development

.NET WebAPI 직렬화 k_BackingField Nastiness

big-blog 2020. 9. 20. 10:22
반응형

.NET WebAPI 직렬화 k_BackingField Nastiness


다음을 직렬화 할 때 :

[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; }
}

나는이 역겨운 엉망이된다.

<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>

무엇을 제공합니까? 이걸 어떻게 예쁘게 만들 수 있습니까? JSON 응답에는 k_BackingField도 포함됩니다.


기본적 으로 웹 API 를 사용 [Serializable]하거나 [DataContract]작업 할 필요가 없습니다 .

모델을 그대로두면 Web API가 모든 공용 속성을 직렬화합니다.

포함 된 항목에 대해 더 많은 제어를 원할 경우에만 클래스와 [DataContract]포함 할 속성을 장식합니다 [DataMember](DCS와 JSON.NET 모두 이러한 속성을 반영하기 때문).

어떤 이유로 [Serializable]클래스에 를 필요로하는 경우 (즉, 어떤 이유로 메모리 스트림으로 직렬화하고, 딥 복사 등을 수행하는 경우) 지원 필드 이름을 방지하기 위해 두 속성을 함께 사용해야합니다.

[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; }
}

더 일반적인 솔루션이 있습니다. [Serializable]속성 을 무시하도록 Json Serializer를 구성 하여 클래스의 속성을 변경할 필요가 없습니다.

응용 프로그램 시작, 즉 Global.asax Application_Start이벤트 에서이 구성을 변경해야합니다 .

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

날짜 직렬화에 대한 형식 지정 및 기타 여러 가지와 같이 Json 직렬화에 대한 기타 변경을 수행 할 수도 있습니다.

이는 Web API JSON 직렬화에만 적용됩니다. 앱의 다른 직렬화 (Web API XML 직렬화, MVC JsonResult ...)는이 설정의 영향을받지 않습니다.


Try using DataContract instead of Serializable for marking your class. For more detail on why, look at this good blog post on serializing automatic properties.


The [DataContract] attributes dosn't worked for me, so it was not an option.

XmlSerializer ignores [XmlAttribute] in WebApi

The above resolution solved it for me.

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;

참고URL : https://stackoverflow.com/questions/12334382/net-webapi-serialization-k-backingfield-nastiness

반응형