Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# svcutil未为minOccurs=0生成指定字段_C#_Wcf_Svcutil.exe - Fatal编程技术网

C# svcutil未为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

我正在使用svcutil从Web服务生成客户端代理。 WSDL包含属性minOccurs设置为0的元素

<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
    属性添加到
    DataMember
    属性。这将阻止在生成的xml中写入元素
  • 或者,将类型更改为
    DateTime?
    =>这将在xml文档中输出类似
    的内容
如果不修改代理,则无法执行此操作

传入消息

同样的逻辑也适用:接收完全省略元素的消息不会有问题(只要代理类中的相应属性具有
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>