c# - svcutil NOT 为 minOccurs=0 生成指定字段

标签 c# wcf svcutil.exe

我正在使用 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/

相关文章:

c# - 为 getter 和 setter 修改变量

c# - 异步调用 wcf 4.5 WCF 服务

linux - svcutil.exe - 如何获取 WSDL

wcf - ChannelFactory<T> 与使用 Svcutil 的预生成代理的性能

c# - 存储通过 wcf 传输的类

c# - 追加两个多维数组对象 [,]

c# - Convert.ToBase64String 是否返回与其源字节数组相同的长度?

c# - IIS 7.5 - Windows Server 2008 - 文件上传 405 错误。代码在 windows 2003 服务器中工作

web-config - 如何将 http 和 https 的 WCF 服务配置合并到一个 web.config 中?

wcf - 在不使用 WCF 的情况下调用 WCF 服务 - 好的还是坏的做法?