我有一门课,如下所示
[Serializable]
public class sample
{
private int m_width;
private int m_height;
public int Width
{
get
{
return this.m_width;
}
set
{
this.m_width = value;
}
}
public int Height
{
get
{
return this.m_height;
}
set
{
this.m_height = value;
}
}
}
如果我使用DataContractJsonSerializer
来序列化该类的对象,我将得到如下所示的json
字符串:
{"m_height":1345,"m_width":1234}
如果我使用Newtonsoft.Json.dll来序列化它,我将得到输出,如下所示:
{"Width":1234,"Height":1345}
如果类标记为可序列化,为什么DataContractSerializer使用后台字段进行序列化?
我是否可以使用Newtonsoft.Json.dll
实现同样的目标?
发布于 2016-04-28 00:15:15
我们有一些被标记为[Serializable]
的对象,因此它们可以使用传统的方法进行序列化,但我们需要在JSON中使用这些对象,以便与Web一起使用。将IgnoreSerializableAttribute
设置为true
将阻止Newtonsoft.Json像微软的序列化者那样行事,而只是序列化公共属性。
TLDR:将此添加到WebApiConfig.cs:
((Newtonsoft.Json.Serialization.DefaultContractResolver)config.Formatters.JsonFormatter.SerializerSettings.ContractResolver).IgnoreSerializableAttribute = true;
发布于 2013-08-19 05:41:50
除非您总是从WCF到WCF通信,否则您最好的选择可能是使用Newtonsoft序列化程序。不幸的是,MS序列化程序似乎遵循了一些特定于微软的标准,这些标准不符合许多web应用程序所期望的标准。
Newtonsoft的序列化程序似乎更标准,甚至MS也将其用于WebAPI,在WebAPI客户端(nuget将为您解压它)。
您会发现另一个不同之处--尝试序列化DateTime类型。您将发现DataContract序列化器以与其他JSON不兼容的不同格式序列化值(您将注意到其中的一些斜杠)。我的理解是,一些AJAX WebForm控件使用了这种替代格式,但它是特定于Microsoft的。
以下是关于日期的更多信息:http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx
发布于 2013-08-19 06:31:33
还有一件事你可能会看到:
DataContractJsonSerializer和Newtonsoft之间的区别仍然存在,但是为什么您会有奇怪的序列化行为--您正在混合您的序列化标准。
可序列化属性与较旧的.Net序列化有关。DataContractSerialization是向后兼容的,但行为可能有所不同。
如果您想要这样做,请用datacontract属性标记类,并用DataMember属性标记要序列化的每个公共成员。(或者删除所有序列化属性,它应该默认为所有公共属性)
这应该可以解释所看到的不同之处,但我仍然建议您更喜欢Newtonsoft序列化程序。
https://stackoverflow.com/questions/18314929
复制相似问题