【问题标题】:Am I using DataContractJsonSerializer or the Json.net one in my web api 2我是在我的 web api 2 中使用 DataContractJsonSerializer 还是 Json.net 之一
【发布时间】:2013-12-20 16:25:12
【问题描述】:

在问了这个question 之后,我试图在 web api 2 中掌握所有这些序列化的东西,我读了这个 http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization

但现在我很困惑

1 在我的 webapiconfig 中我没有这行

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.UseDataContractJsonSerializer = true;

所以我假设我使用的是默认的 Json.net 序列化程序。无论如何,我仍然可以在一个类中使用 DataContract,因此只有用 DataMember 属性修饰的属性才会被序列化。这两个假设是否正确?

2 如果我不使用 DataContract 装饰一个类,所有属性都将被序列化。 Json.net 和 DataContractJsonSerializer 都会发生这种情况

3 如果我更改(如在我链接的问题中)序列化程序仍然使用它的解析器,是因为它是 Json.net 的一件事还是一件事与另一件事无关?因为如果我在全局中使用它

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.UseDataContractJsonSerializer = true;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

即使它没有引发任何问题,它似乎也没有发现它(也没有使用自定义的 contractresolver)

3 如果我有一个派生自另一个类的类,并且我用 DataContract 装饰父类,在我看来,我必须使用 DataMember 装饰子类的属性以对其进行序列化。还是我做错了什么?

谢谢

【问题讨论】:

    标签: c# serialization asp.net-web-api


    【解决方案1】:

    所以我假设我使用的是默认的 Json.net 序列化程序。无论如何,我仍然可以在一个类中使用 DataContract,因此只有用 DataMember 属性修饰的属性才会被序列化。这两个假设是否正确?

    Json.Net 是默认设置,您是对的。两个序列化程序都支持 DataMembers。 Json.Net 不需要它们。

    2 如果我不使用 DataContract 装饰一个类,所有属性都将被序列化。 Json.net 和 DataContractJsonSerializer 都会发生这种情况

    DataContractJsonSerializer 旨在与 WCF 客户端应用程序一起使用,其中序列化类型通常是应用了 DataContract 属性的 POCO 类。没有 DataContract,没有序列化。 WCF 的映射机制使发送和接收非常简单,但前提是您的平台是同构的。如果您开始混合使用不同的工具集,您的程序可能会跑偏。

    JavaScriptSerializer 可以序列化任何类型,包括匿名类型(一种方式),并且以更一致的方式进行。您失去了 WCF 的“自动”功能,但获得了更多集成选项。

    3 如果我更改(如在我链接的问题中)序列化程序仍然使用它的解析器,是因为它是 Json.net 的一件事还是一件事与另一件事无关?因为如果我在全局中使用它

    将您的代码放在 Global.asax 中,并且应该使用 DataContractJsonSerializer。你怎么知道它没有被捡到?

    4 如果我有一个派生自另一个类的类,并且我使用 DataContract 装饰父类,在我看来,我必须使用 DataMember 装饰子类的属性以对其进行序列化。

    是的。如果你使用 DataContractJsonSerializer。

    【讨论】:

    • @Thomas_Jaskula 你怎么知道它没有被捡起?因为他们似乎没有来骆驼套。但我肯定会检查这一点
    • 是的,@ThomasJaskula 据我了解,它没有被称为 CamelCasePropertyNamesContractResolver 放置这三行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 2015-07-12
    相关资源
    最近更新 更多