Serialization .NETWebAPI序列化k_BackingField肮脏
当我序列化以下内容时:Serialization .NETWebAPI序列化k_BackingField肮脏,serialization,asp.net-web-api,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; } } [可序列化] 公共类
[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; }
}
[可序列化]
公共类错误
{
公共字符串状态{get;set;}
公共字符串消息{get;set;}
公共字符串ErrorReferenceCode{get;set;}
公共列表错误{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>
发生异常。请联系printmee支持部门
988232ec-6bc9-48f3-8116-7ff7c71302dd
有什么好处?我怎样才能把它弄漂亮?JSON响应还包含k_BackingField尝试使用DataContract而不是Serializable来标记类。有关原因的更多详细信息,请查看此默认情况下,您不需要使用
[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; }
}
[可序列化]
[数据合同]
公共类错误
{
[数据成员]
公共字符串状态{get;set;}
[数据成员]
公共字符串消息{get;set;}
[数据成员]
公共字符串ErrorReferenceCode{get;set;}
[数据成员]
公共列表错误{get;set;}
}
有一个更通用的解决方案:您可以将Json序列化程序配置为忽略[Serializable]
属性,这样就不必更改类中的属性
您应该在应用程序启动时进行此配置更改,即在Global.asaxapplication\u 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…)将不受此设置的影响。我无法使用[DataContract]属性,因此这不是一个选项
上述决议为我解决了这个问题
GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;
就是这样--我只需要删除[Serializable]。谢谢。谢谢菲利普,由于缓存的原因,必须保留属性。。顺便说一句,我是你博客的狂热粉丝。。继续!这太可怕了。为什么微软在序列化方面做不到任何正确的事情呢?有一个更通用的解决方案,正如我在下面的回答中所展示的。也许序列化的问题在于“正确”的定义,每个人都需要以自己的方式使用数据。与在任何地方添加[DataContract]和[DataMember]属性相比,我更喜欢这个解决方案。非常感谢。这不是你应该一直使用的东西,但这是一个巧妙的技巧。有点像撬棍,可以帮助你避开混乱的情况,在这种情况下,你没有机会改变模型或深入重构代码库。你是对的,这不是最好的方法。然而,在某些情况下,重构不仅是一种奢侈,而且根本不可行。例如,如果代码库使用WCF或XML序列化,则它确实需要数据协定或XML序列化属性。你不能改变这一点。幸运的是,JSON.NET非常强大:它确实支持数据协定、XML序列化及其自身属性,您可以控制它如何使用它们进行序列化,甚至完全忽略它们。您甚至可以添加自己的实现。当然,我更喜欢保持没有属性的干净类别。这是默认情况下应该如何工作的!为什么我们要在序列化流中使用wabt backingfield胡说八道?如果您使用的是web api并且目标是.net framework的版本4,那么您需要更新Netwonsoft.Json包才能正常工作,即更新包Newtonsoft.Json
。这对我有帮助: