C# svcutil未为minOccurs=0生成指定字段
我正在使用svcutil从Web服务生成客户端代理。 WSDL包含属性minOccurs设置为0的元素C# svcutil未为minOccurs=0生成指定字段,c#,wcf,svcutil.exe,C#,Wcf,Svcutil.exe,我正在使用svcutil从Web服务生成客户端代理。 WSDL包含属性minOccurs设置为0的元素 <xsd:element minOccurs="0" name="dateMaxValue" type="xsd:dateTime"></xsd:element> 当我使用option/serializer:XmlSerializer生成代理时,我会得到xxx指定的属性 private System.DateTime dateMaxValueField; priva
<xsd:element minOccurs="0" name="dateMaxValue" type="xsd:dateTime"></xsd:element>
当我使用option/serializer:XmlSerializer生成代理时,我会得到xxx指定的属性
private System.DateTime dateMaxValueField;
private bool dateMaxValueFieldSpecified;
编辑
对于可选字段,我希望在字段没有值时不发送或不读取该字段(与XmlSerializer的specified=false等效)
当前传入和传出数据设置为默认值。
如何使用DataContractSerializer获得类似的行为?
或者,如果它已经存在,我如何使用它?您观察到的行为是正常的:
*指定的
字段仅在使用XmlSerializer时生成
DataContractSerializer从不生成那些指定的字段。相反它将DataMember
属性的IsRequired
属性设置为false(这是该属性的默认值,因此您甚至不会在属性中看到它)
传出消息 您希望忽略在传出消息中没有值的字段。 问题在于
DateTime
是一种值类型,这意味着即使未设置它,它也有一个默认值“0001-01-01T00:00:00”
如果不想在传出消息中输出,可以:
- 将
属性添加到EmitDefaultValue=false
属性。这将阻止在生成的xml中写入元素DataMember
- 或者,将类型更改为
=>这将在xml文档中输出类似DateTime?
的内容
IsRequired=false
)。请注意,由于DateTime
是一种值类型,您将始终使用其默认值(“0001-01-01”)填充它。如果希望接收null
实例,则需要修改代理并使用DateTime?
类型
但是,如果您希望能够解析包含以下内容的消息:
<dateMaxValueField></dateMaxValueField>
那么我恐怕没有办法用DataContractSerializer来实现这一点
注意:XmlSerializer在这些场景中允许更大的灵活性(例如,出于兼容性原因,需要精确控制XML时)。XmlSerializer和DataContractSerializer遵循不同的序列化规则。。。DCS是否遵守
ShouldSerialize*
惯例?但最终:如果它不在这个列表中,您可能无法让它自动执行:-您可能可以在部分类中手动执行它。我并不是编辑该文件的每一个类来添加所需的行为:sa-wise-choise;p但是,如果您足够关心的话,您可能能够将其自动化—对某些部分类
文件(或多个文件)的类型和属性进行迭代的反射。不是很优雅,但应该只需要几分钟就可以编写脚本。谢谢您的帮助,但我要查找的似乎不是xxx指定的字段。我希望能够检测到xml中没有字段,或者告诉序列化程序不要序列化某些数据(而不是使用默认值序列化)。我仍然不知道如何使用DCS。对我来说,这似乎是一个非常基本的行为。你能控制webservice wsdl吗?谢谢你的回答,但我似乎没有正确的问题:)请参阅edit我不确定你能用DataContractSerializer做你想做的事,特别是如果您对原始wsdl.OK没有任何控制权,我会将您的答案标记为已接受,因为我想没有其他方法了。我真正需要的是为我的字段设置EmitDefaultValue=false。但我还没有找到一种方法来自动输出它,我无法手动修改所有内容。我将返回到旧的XmlSerializer。
<dateMaxValueField></dateMaxValueField>