88

当我序列化以下内容时:

[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

4

4 回答 4

129

默认情况下,您既不需要使用也不需要使用[Serializable]Web [DataContract]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; }
}
于 2012-09-10T20:46:49.337 回答
97

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

您应该在应用程序启动时进行此配置更改,即在 Global.asaxApplication_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...)不会受此设置影响。

于 2014-03-18T16:58:38.213 回答
2

尝试使用 DataContract 而不是 Serializable 来标记您的课程。有关原因的更多详细信息,请查看这篇关于序列化自动属性的优秀博客文章。

于 2012-09-09T02:22:32.567 回答
0

[DataContract] 属性对我不起作用,所以它不是一个选项。

XmlSerializer 忽略 WebApi 中的 [XmlAttribute]

上述决议为我解决了这个问题。

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;
于 2018-10-24T07:17:17.710 回答