我们使用 DataContract 序列化程序(非XmlSerializer)在IIS上托管WCF服务,我们的需求非常类似于@Surya KLSV发布的“Dynamically ignore data members from getting serialized”。
根据我们不想详述的一些业务规则,我们的用户可以选择(通过配置)接收或不接收他们答案中的某些成员。所以我们使用 EmitDefaultValue = false ,当用户不想接收 BirthDate 成员时,我们分配空值并且它不会出现在响应中(JSON和XML) )。
我们在选择接收成员 BirthDate 的用户时遇到问题。在某些情况下,我们的数据库中不存在此值,它是 null ,当我们序列化响应时,此成员不会出现。
我们想要的这些情况是要使用空值序列化的成员。对于想要收到会员的用户:
JSON :
"Someone": {
"BirthDate": null,
"Name": "Josua",
"Age": null
}
XML :
<Someone>
<BirthDate xsi: nil = "true"/>
<Name> Josua </Name>
<Age xsi: nil = "true"/>
</Someone>
对于不想要接收会员的用户
JSON :
"Someone": {
"Name": "Josua",
}
XML :
<Someone>
<Name> Josua </Name>
</Someone>
现在我们正在以一种丑陋的方式解决这个问题:为此分配 MinDate 值,因此该成员在响应中被序列化,对于成员Age,我们分配0(零)
我们无法更改 EmitDefaultValue = true ,因为我们将在不希望接收这些成员的客户端上中断设置,除非这可以在运行时完成。我们还是找不到怎么做。
我们已经尝试过Carlos's Figueira blog的解决方案,但没有成功,因为该框架仍然尊重 EmitDefaultValue
这是ServiceContract和DataContract的一个例子:
[ServiceContract]
public interface ISomeoneService
{
[OperationContract (Name = "SearchSomeoneJson")]
[WebInvoke (Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "SearchSomeone/json?Name={name}")
Someone SearchSomeoneJson (string name);
[OperationContract (Name = "SearchSomeoneXml")]
[WebInvoke (Method = "GET", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "SearchSomeone/xml?Name={name}")
Someone SearchSomeoneXml (string name);
}
[DataContract]
public class Someone : ISomeoneService
{
[DataMember (EmitDefaultValue = false)]
public DateTime? BirthDate {get; set; }
[DataMember (EmitDefaultValue = false)]
public string Name {get; set; }
[DataMember (EmitDefaultValue = false)]
public int? Age = null;
}