Why does a Web Service DataMember's Specified Attribute need to be set for int and Data but not for String

.net-2.0, wcf, web-services

Solution

The default parameters for the DataMember attribute are:

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

If the property you are exposing is a non-nullable value type you should use:

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

Problem

I have created a web service via WCF. Then I exposed it as a web service to make it usable with a .NET 2.0 application. I created some DataContract with DataMember that could be used for by the exposed OperationContract. I notice that when I try to create DataClass to be passed in the web service that each DataContract attribute now has a partner "Specified" attribute for each member. For example: ``` [DataContract] public class Sales { [DataMember] public int InvoiceNo; ... } ``` When I create an instance of Sales in the web service client. I get attribute named InvoiceNo and InvoiceNoSpecified. Now here is my question, when the attribute is of type string, I do not need to set the corresponding "Specified" attribute to true, but when the attribute type is a int or DateTime, if I do not set the corresponding "Specified" attribute to true, the value becomes null in the web service host. Is there a way to avoid setting the Specified attribute? Cause I need to call the web service functions in a lot of places in my code. It would really be difficult to keep track of them all.

Original source