【问题标题】:WCF DataContract - marking member IsRequired=falseWCF DataContract - 标记成员 IsRequired=false
【发布时间】:2009-10-14 14:50:13
【问题描述】:

我的合同如下:

[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 是否意味着我可以在 StrB 未初始化的情况下通过网络传递MyObj 的实例,还是意味着我可以在没有StrB 的情况下通过网络传递MyObj 的实例?

如果是后者,我如何在没有 StrB 的情况下实际实例化 + 发送 MyObj 的实例?

【问题讨论】:

    标签: wcf datacontract


    【解决方案1】:

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

    所以通过网络你可以获得<MyObj></MyObj>,它会反序列化成一个MyObj实例就好了。

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

    【讨论】:

    • 好的,鉴于我上面的课程,我可以发送 abc - 这就是你的意思,对吧?如果是这样,我如何用 StrA 而不是 StrB.. 实例化 MyObj??
    • 是的,这就是我要说的。我不知道您的 DataContract 是否会起作用。我不确定 DataMember 是否需要公共 getter/setter。您不能使用上面的代码用 StrA 而不是 StrB 实例化 MyObj。如果您创建另一个不包含 StrB 的 MyObj 版本,那么您可以。
    【解决方案2】:

    我如何实际实例化 + 发送 跨 MyObj 的一个实例,没有 强弱?

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

    【讨论】:

      猜你喜欢
      • 2011-08-17
      • 2012-04-15
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      相关资源
      最近更新 更多