【发布时间】:2014-04-01 09:16:21
【问题描述】:
我正在使用 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;
编辑
对于可选字段,我希望该字段在没有值时不被发送或不被读取(等效于 XmlSerializer 中的指定=false) 当前传入和传出数据设置为默认值。 如何使用 DataContractSerializer 获得类似的行为? 或者如果它已经存在,我该如何使用它?
【问题讨论】:
-
XmlSerializer 和 DataContractSerializer 遵循不同的序列化规则... DCS 是否甚至遵守
ShouldSerialize*约定?但最终:如果它不在此列表中,您可能无法使其自动执行:msdn.microsoft.com/en-us/library/aa347733(v=vs.110).aspx - 您也许可以在partial class中手动执行。 -
目前我有 140k 行生成的代码,我可能需要 momre。我没有编辑该文件的每个类来添加所需的行为:s
-
一个明智的选择 ;p 不过,如果您足够关心,您也许可以将其自动化 - 反射会迭代一些
partial class文件(或多个文件)的类型和属性,然后您将其放入. 不优雅,但编写脚本只需要几分钟 -
感谢您的帮助,但似乎我要查找的不是 xxxSpecified 字段。我希望能够检测到 xml 中不存在字段或告诉序列化程序不要序列化某些数据(而不是使用默认值序列化)的方法。我仍然不知道如何使用 DCS 来做到这一点。对我来说,这似乎是一种非常基本的行为。
-
您是否可以控制 web 服务 wsdl?
标签: c# wcf svcutil.exe