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)当前传入和传出数据设置为默认值。如何使用数据合同序列化程序获得类似的行为?或者如果它已经存在,我该如何使用它?
您观察到的行为是正常的:仅在使用 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 进行精确控制时)具有更大的灵活性。