WCF DataContract - 标记成员IsRequired = false

时间:2009-10-14 14:50:14

标签: wcf datacontract

我的合同如下:

[DataContract]
public class MyObj
{
    [DataMember(IsRequired=true)]
    public string StrA {get; private set;}

    [DataMember(IsRequired=false)]
    public string StrB {get; private set;}
}

IsRequired究竟是什么意思? IsRequired=false是否意味着我可以将MyObj的实例传递给StrB已整合的MyObj,或者是否意味着我可以通过{StrB传递MyObj的实例{1}}缺席?

如果是后者,我如何在没有StrB的{​​{1}}实例中实际实例化+发送?

2 个答案:

答案 0 :(得分:3)

DataMember的IsRequired告诉序列化引擎是否必须在底层XML中显示StrB的值。

因此,您可以通过线路获取<MyObj></MyObj>,它将反序列化为MyObj实例。

编辑:如果没有StrB存在,您无法实际初始化MyObj的实例。用于此的是兼容性和可扩展性。例如,客户端可能没有更新的MyObj版本,并且没有StrB存在。在这种情况下,服务器代码可以将StrB标记为不需要,并且在服务器端收到消息时不会出现序列化异常。

答案 1 :(得分:2)

  

我如何实际实例化+发送   跨越MyObj的实例而没有   STRB?

正如我在WCF and Anonymous Types中提到的那样,您可以使用[DataMember(EmitDefaultValue = false)]。这将确保当数据成员处于其默认值时(例如,对于字符串为null),将不会发出它。