Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serialization .NETWebAPI序列化k_BackingField肮脏_Serialization_Asp.net Web Api - Fatal编程技术网

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.asax
application\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
。这对我有帮助: