[serialization] .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 …)는이 설정의 영향을받지 않습니다.


답변

클래스 표시를 위해 Serializable 대신 DataContract를 사용해보십시오. 이유에 대한 자세한 내용은 자동 속성 직렬화에 대한좋은 블로그 게시물을 참조하십시오.


답변

[DataContract] 속성은 저에게 효과가 없었으므로 옵션이 아닙니다.

XmlSerializer는 WebApi에서 [XmlAttribute]를 무시합니다.

위의 해상도로 해결되었습니다.

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


답변