svcutil 不为 minOccurrence=0 生成指定的字段

本文关键字:字段 不为 minOccurrence svcutil | 更新日期: 2023-09-27 17:55:36

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

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

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

private System.DateTime dateMaxValueField;

当我使用选项/serializer:XmlSerializer 生成代理时,我得到 xxxSpecified 属性。

private System.DateTime dateMaxValueField;
private bool dateMaxValueFieldSpecified;

编辑

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

svcutil 不为 minOccurrence=0 生成指定的字段

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

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


传出邮件

您希望省略传出邮件中没有值的字段。问题是DateTime是一个值类型,这意味着即使没有设置,它的默认值为"0001-01-01T00:00:00"。

如果不想在传出邮件中输出它,可以:

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

如果不修改代理,就没有办法做到这一点。

传入消息

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

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

<dateMaxValueField></dateMaxValueField>

那么恐怕没有办法用数据合同序列化程序做到这一点。


注意: XmlSerializer 在这些情况下(例如,出于兼容性原因,需要对 XML 进行精确控制时)具有更大的灵活性。