.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来标记你的类。 有关为什么的更多细节,看看这个很好的博客文章序列化自动属性。