动态发送默认值是否被序列化

时间:2017-09-18 16:43:02

标签: c# json xml wcf serialization

我们使用 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;
}

0 个答案:

没有答案