Mic*_*cah 84 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; }
}
Run Code Online (Sandbox Code Playgroud)
我得到了这个令人作呕的混乱:
<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>
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?我怎么能这么漂亮?JSON响应还包含k_BackingField
Fil*_*p W 123
默认情况下,您既不需要既不使用[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; }
}
Run Code Online (Sandbox Code Playgroud)
Jot*_*aBe 88
有一个更通用的解决方案:您可以配置Json Serializer以忽略该[Serializable]属性,这样您就不必更改类中的属性.
您应该在应用程序启动时更改此配置,即在Global.asax Application_Start事件中:
var serializerSettings =
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
var contractResolver =
(DefaultContractResolver)serializerSettings.ContractResolver;
contractResolver.IgnoreSerializableAttribute = true;
Run Code Online (Sandbox Code Playgroud)
您还可以对Json序列化进行其他更改,例如指定序列化日期的格式以及许多其他内容.
这仅适用于Web API JSON序列化.应用程序中的其他序列化(Web API XML序列化,MVC JsonResult ...)不受此设置的影响.
| 归档时间: |
|
| 查看次数: |
29043 次 |
| 最近记录: |