.NET WebAPI序列化k_BackingField Nastiness

Mic*_*cah 84 serialization asp.net-web-api

当我序列化以下内容时:

[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; }
}
Run Code Online (Sandbox Code Playgroud)

我得到了这个令人作呕的混乱:

<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>
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?我怎么能这么漂亮?JSON响应还包含k_BackingField

Fil*_*p W 123

默认情况下,您既不需要既不使用[Serializable]也不[DataContract]使用Web API.

只需按原样保留模型,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; }
}
Run Code Online (Sandbox Code Playgroud)

  • 这太可怕了.为什么Microsoft**EVER**在序列化方面做不了什么? (19认同)
  • 就是这样 - 我只需要删除[Serializable].谢谢. (6认同)

Jot*_*aBe 88

有一个更通用的解决方案:您可以配置Json Serializer以忽略该[Serializable]属性,这样您就不必更改类中的属性.

您应该在应用程序启动时更改此配置,即在Global.asax Application_Start事件中:

var serializerSettings =
  GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
var contractResolver =
  (DefaultContractResolver)serializerSettings.ContractResolver;
contractResolver.IgnoreSerializableAttribute = true;
Run Code Online (Sandbox Code Playgroud)

您还可以对Json序列化进行其他更改,例如指定序列化日期的格式以及许多其他内容.

这仅适用于Web API JSON序列化.应用程序中的其他序列化(Web API XML序列化,MVC JsonResult ...)不受此设置的影响.

  • 我喜欢这个解决方案比在各处添加[DataContract]和[DataMember]属性要好得多.谢谢!! (4认同)