首页 文章

为什么需要为int和Data设置Web Service DataMember的Specified Attribute,而不是为String设置

提问于
浏览
7

我已经通过WCF创建了一个Web服务 . 然后我将它作为Web服务公开,以使其可用于.NET 2.0应用程序 . 我使用DataMember创建了一些DataContract,可以由暴露的OperationContract使用 .

我注意到当我尝试创建要在Web服务中传递的DataClass时,每个DataContract属性现在都为每个成员提供了一个伙伴“Specified”属性 .

例如:

[DataContract]
public class Sales
{

  [DataMember]
  public int InvoiceNo;

...
}

当我在Web服务客户端中创建Sales实例时 . 我得到名为InvoiceNo和InvoiceNoSpecified的属性 .

现在这里是我的问题,当属性是string类型时,我不需要将相应的“Specified”属性设置为true,但是当属性类型是int或DateTime时,如果我没有设置相应的“Specified”如果属性为true,则该值在Web服务主机中变为null . 有没有办法避免设置Specified属性?因为我需要在我的代码中的很多地方调用Web服务功能 . 要跟踪它们真的很难 .

3 回答

  • 3

    DataMember属性的默认参数是:

    bool EmitDefaultValue (default true)
    bool IsRequired (default false)
    

    如果您要公开的属性是不可为空的值类型,则应使用:

    [DataMember(IsRequired = true)]
    public int InvoiceNo;
    
  • 1

    你可以阅读解释here .

    引自XmlSerializer

    如果架构包含可选元素(minOccurs ='0'),或者架构包含默认值,则有两个选项 . 一种选择是使用System.ComponentModel.DefaultValueAttribute指定默认值,如以下代码所示 . 另一种选择是使用特殊模式创建XmlSerializer可识别的布尔字段,并将XmlIgnoreAttribute应用于该字段 . 该模式以propertyNameSpecified的形式创建 . 例如,如果有一个名为“MyFirstName”的字段,您还将创建一个名为“MyFirstNameSpecified”的字段,该字段指示XmlSerializer是否生成名为“MyFirstName”的XML元素 .

    到目前为止我唯一可接受的解决方法是使用XmlSerializerFormatAttribute来使用XmlSerializer而不是DataContractSerializer .

  • 9

    你也可以使用 [DataMember(isRequired=True)]

相关问题