我正在使用 svcutil 从 Web 服务生成客户端代理。 WSDL 包含属性 minOccurs 设置为 0 的元素
<xsd:element minOccurs="0" name="dateMaxValue" type="xsd:dateTime"></xsd:element>
然而,生成的 DataContract 完全忽略了这个属性,只是创建了一个没有任何 dateMaxValueSpecified 属性的普通 dateMaxValue 属性
private System.DateTime dateMaxValueField;
当我使用选项/serializer:XmlSerializer 生成代理时,我得到了 xxxSpecified 属性。
private System.DateTime dateMaxValueField;
private bool dateMaxValueFieldSpecified;
编辑
对于可选字段,我希望该字段在没有值时不被发送或不被读取(相当于 specified=false 与 XmlSerializer) 当前传入和传出数据设置为默认值。 如何使用 DataContractSerializer 获得类似的行为? 或者,如果它已经存在,我该如何使用它?
最佳答案
您观察到的行为是正常的:*Specified
只有在使用 XmlSerializer 时才会生成字段。
DataContractSerializer 从不生成那些指定的字段。反而。它将设置 IsRequired
DataMember
的属性(property)属性设置为 false(这是此属性的默认值,因此您甚至不会在属性中看到它)。
外发消息
您想忽略在传出消息中没有值(value)的字段。
问题是 DateTime
是值类型,这意味着即使不设置,它也有一个默认值“0001-01-01T00:00:00”。
如果不想在外发消息中输出,可以:
- 添加
EmitDefaultValue = false
属性(property)给DataMember
属性。这将完全阻止在生成的 xml 中写入该元素。 - 或者,将类型更改为
DateTime?
=> 这将输出类似<dateMaxValueField i:nil="true"/>
的内容在您的 xml 文档中。
不修改代理是没办法的。
收到的消息
同样的逻辑适用:接收完全省略元素的消息不会有问题(只要代理类中的相应属性具有 IsRequired = false
)。请注意,作为DateTime
是一种值类型,您将始终使用其默认值(“0001-01-01”)填充它。如果您希望收到 null
例如,那么您需要修改代理并使用 DateTime?
类型。
但是,如果您希望能够解析包含以下内容的消息:
<dateMaxValueField></dateMaxValueField>
那么恐怕无法使用 DataContractSerializer 来完成。
注意:XmlSerializer 在这些场景中提供了更大的灵 active (例如,出于兼容性原因,需要对 XML 进行精确控制时)。
关于c# - svcutil NOT 为 minOccurs=0 生成指定字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22781516/