.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

默认情况下,您不需要使用[Serializable][DataContract]来使用Web API。

只需保持模型不变,Web API将为您序列化所有公共属性。

只有当你想对包含的内容有更多的控制时,你才用[DataContract]装饰你的类,并且[DataMember]要包含的属性(因为DCS和JSON.NET都会重写这些属性)。

如果由于某种原因,你需要在你的类上使用[Serializable] (也就是说,由于某种原因将它序列化为内存stream,做深度拷贝等),那么必须同时使用这两个属性来防止支持字段名称:

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

有一个更通用的解决scheme:你可以configurationJson序列化器忽略[Serializable]属性,这样就不必改变你的类的属性。

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

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

您还可以对Json序列化进行其他更改,例如指定用于序列化date的格式以及许多其他事情。

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

尝试使用DataContract而不是Serializable来标记你的类。 有关为什么的更多细节,看看这个很好的博客文章序列化自动属性。