【发布时间】: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。