【问题标题】:Suppress emitting of default values in WCF ODATA禁止在 WCF ODATA 中发出默认值
【发布时间】:2013-11-05 23:23:52
【问题描述】:

我在运行 WCF 数据服务 5.5 的自托管 WCF ODATA 服务中设置了数据实体 POCO。

数据实体有几个通常为空的字符串属性。我想在它们为空时抑制这些属性的输出,以减少通过线路的数据的大小。

[DataServiceEntity]
[DataServiceKey("Id")]
public class MyData
{ 
    public string Id { get; set; }

    [System.Runtime.Serialization.DataMember(EmitDefaultValue=false)]
    public string Description { get; set; }
}

DataMember(EmitDefaultValue = false)似乎对数据实体序列化没有影响:

{
"Id":"test4",
"Description":null
}

如何说服 WCF 数据服务取消该 null 属性?

【问题讨论】:

  • 您能否从 IgnoreDataMember(或其父级)继承来实现 IgnoreIfNull,它在序列化运行时看起来像 IgnoreDataMember?
  • IgnoreDataMember 不会主动参与确定将被序列化的内容 - 它只是 DataContractSerializer 查找的静态标志。如果我们创建一个从 IgnoreDataMember 继承的 IgnoreIfNull,DataContractSerializer 只会将其视为 IgnoreDataMember。行为没有变化。
  • 我认为部分问题是 WCF 数据服务没有使用 DataContractSerializer。这些 POCO 类未使用 DataContract 属性进行标记。添加 DataContract 属性不会改变行为。
  • 如果您的服务器设置为 gzip JSON,它可能应该这样做,那么 null 将占用非常少的带宽......尽管在反序列化之后,它可能会在客户端设备上消耗更多的 CPU 时间和内存。
  • AFAIK,WCF 数据服务使用反射来序列化实体并且不使用 DataContractSerializer。

标签: wcf-data-services


【解决方案1】:

您知道 ASP.NET WEB API OData 提供程序吗? http://www.nuget.org/packages/Microsoft.AspNet.WebApi.OData

您可以编写自己的序列化程序。 (继承自 ODataFeedSerializer) ODataEntry 类有一个名为“Properties”的键/值属性。您可以尝试清除那里的空属性。

【讨论】:

  • 我们的项目没有使用 ASP.NET。
【解决方案2】:

它看起来如此困难的一个原因是它不是一个实现问题,而是一个规范问题。我很快就浏览了 OData 规范(核心/协议和 JSON 详细/轻量级),除了在使用 PATCH 时这样的明显地方外,没有提到任何属性遗漏。

正确扫描文件可能会发现更准确的信息。

如果我是对的,那么您不会想要忽略这些,因为这可能会使您无法控制的客户感到困惑。如果您控制所有客户端并且您确信您会保留该控制权,您可能会破解某些东西,但我会将这种破解视为不兼容的 OData 扩展(包含所有内容)。

最好的做法是验证这一点,并在相关的情况下建议对协议的下一版本进行改进。 OData mailing list 可能会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2011-01-03
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多