首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当我们使用JSON.Net序列化可序列化对象时,JSON字符串不同于DatacontractJSON序列化程序

当我们使用JSON.Net序列化可序列化对象时,JSON字符串不同于DatacontractJSON序列化程序
EN

Stack Overflow用户
提问于 2013-08-19 13:23:42
回答 5查看 1.2K关注 0票数 4

我有一门课,如下所示

代码语言:javascript
代码运行次数:0
运行
复制
[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字符串:

代码语言:javascript
代码运行次数:0
运行
复制
{"m_height":1345,"m_width":1234}

如果我使用Newtonsoft.Json.dll来序列化它,我将得到输出,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
{"Width":1234,"Height":1345}

如果类标记为可序列化,为什么DataContractSerializer使用后台字段进行序列化?

我是否可以使用Newtonsoft.Json.dll实现同样的目标?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-04-28 08:15:15

我们有一些被标记为[Serializable]的对象,因此它们可以使用传统的方法进行序列化,但我们需要在JSON中使用这些对象,以便与Web一起使用。将IgnoreSerializableAttribute设置为true将阻止Newtonsoft.Json像微软的序列化者那样行事,而只是序列化公共属性。

TLDR:将此添加到WebApiConfig.cs:

代码语言:javascript
代码运行次数:0
运行
复制
((Newtonsoft.Json.Serialization.DefaultContractResolver)config.Formatters.JsonFormatter.SerializerSettings.ContractResolver).IgnoreSerializableAttribute = true;
票数 2
EN

Stack Overflow用户

发布于 2013-08-19 13: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

票数 1
EN

Stack Overflow用户

发布于 2013-08-19 14:31:33

还有一件事你可能会看到:

DataContractJsonSerializer和Newtonsoft之间的区别仍然存在,但是为什么您会有奇怪的序列化行为--您正在混合您的序列化标准。

可序列化属性与较旧的.Net序列化有关。DataContractSerialization是向后兼容的,但行为可能有所不同。

如果您想要这样做,请用datacontract属性标记类,并用DataMember属性标记要序列化的每个公共成员。(或者删除所有序列化属性,它应该默认为所有公共属性)

这应该可以解释所看到的不同之处,但我仍然建议您更喜欢Newtonsoft序列化程序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18314929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档