我的合同如下:
[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}}实例中实际实例化+发送?
答案 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),将不会发出它。