5

我的合同如下:

[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

如果是后者,我如何在MyObjwithout的实例上实际实例化 + 发送StrB

4

2 回答 2

3

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

因此,您可以通过网络获得<MyObj></MyObj>它,它将反序列化为 MyObj 实例就好了。

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

于 2009-10-14T14:53:53.147 回答
2

我如何在没有 StrB 的情况下通过 MyObj 实例实例化 + 发送?

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

于 2009-10-14T16:11:59.660 回答