svcutil NOT为minOccurs = 0生成指定的字段

时间:2014-04-01 09:16:22

标签: c# wcf svcutil.exe

我正在使用svcutil从Web服务生成客户端代理。 WSDL包含属性minOccurs设置为0

的元素
<xsd:element minOccurs="0" name="dateMaxValue" type="xsd:dateTime"></xsd:element>

但是生成的DataContract完全忽略了这个属性,只是创建了一个普通的dateMaxValue属性而没有任何dateMaxValueSpecified属性

private System.DateTime dateMaxValueField;

当我使用选项/序列化器生成代理时:XmlSerializer,我得到了xxxSpecified属性。

private System.DateTime dateMaxValueField;

private bool dateMaxValueFieldSpecified;

修改

对于可选字段,我希望字段在没有值时被发送或不被读取(与XmlSerializer相当于指定= false) 当前传入和传出数据设置为默认值。 如何使用DataContractSerializer获得类似的行为? 或者如果它已经存在,我该如何使用它?

1 个答案:

答案 0 :(得分:6)

您观察到的行为是正常的:*Specified字段仅在使用XmlSerializer时生成。

DataContractSerializer从不生成那些指定字段。代替。它会将IsRequired属性的DataMember属性设置为false(这是此属性的默认值,因此您甚至不会在属性中看到它。)


传出讯息

您想要省略外发邮件中没有值的字段。 问题是DateTime是一个值类型,这意味着即使没有设置它,它的默认值为“0001-01-01T00:00:00”。

如果您不想在外发留言中输出,可以:

  • EmitDefaultValue = false属性添加到DataMember属性。这将阻止在生成的xml中写入元素。
  • 或者,将类型更改为DateTime? =&gt;这将在您的xml文档中输出类似<dateMaxValueField i:nil="true"/>的内容。

如果不修改代理,就无法做到。

传入消息

同样的逻辑适用:接收完全省略元素的消息没有问题(只要代理类中的相应属性具有IsRequired = false)。请注意,由于DateTime是值类型,因此您将始终使用其默认值(“0001-01-01”)填充它。如果您希望收到null个实例,则需要修改代理并使用DateTime?类型。

但是,如果您希望能够解析包含以下内容的消息:

<dateMaxValueField></dateMaxValueField>

然后我担心DataContractSerializer无法做到这一点。


注意:XmlSerializer在这些场景中允许更大的灵活性(例如,出于兼容性原因,需要对XML进行精确控制时)。