我正在使用svcutil从Web服务生成客户端代理。 WSDL包含属性minOccurs设置为0
的元素<xsd:element minOccurs="0" name="dateMaxValue" type="xsd:dateTime"></xsd:element>
但是生成的DataContract完全忽略了这个属性,只是创建了一个普通的dateMaxValue属性而没有任何dateMaxValueSpecified属性
private System.DateTime dateMaxValueField;
当我使用选项/序列化器生成代理时:XmlSerializer,我得到了xxxSpecified属性。
private System.DateTime dateMaxValueField;
private bool dateMaxValueFieldSpecified;
修改
对于可选字段,我希望字段在没有值时被发送或不被读取(与XmlSerializer相当于指定= false) 当前传入和传出数据设置为默认值。 如何使用DataContractSerializer获得类似的行为? 或者如果它已经存在,我该如何使用它?
答案 0 :(得分:6)
您观察到的行为是正常的:*Specified
字段仅在使用XmlSerializer时生成。
DataContractSerializer从不生成那些指定字段。代替。它会将IsRequired
属性的DataMember
属性设置为false(这是此属性的默认值,因此您甚至不会在属性中看到它。)
传出讯息
您想要省略外发邮件中没有值的字段。
问题是DateTime
是一个值类型,这意味着即使没有设置它,它的默认值为“0001-01-01T00:00:00”。
如果您不想在外发留言中输出,可以:
EmitDefaultValue = false
属性添加到DataMember
属性。这将阻止在生成的xml中写入元素。DateTime?
=&gt;这将在您的xml文档中输出类似<dateMaxValueField i:nil="true"/>
的内容。如果不修改代理,就无法做到。
传入消息
同样的逻辑适用:接收完全省略元素的消息没有问题(只要代理类中的相应属性具有IsRequired = false
)。请注意,由于DateTime
是值类型,因此您将始终使用其默认值(“0001-01-01”)填充它。如果您希望收到null
个实例,则需要修改代理并使用DateTime?
类型。
但是,如果您希望能够解析包含以下内容的消息:
<dateMaxValueField></dateMaxValueField>
然后我担心DataContractSerializer无法做到这一点。
注意:XmlSerializer在这些场景中允许更大的灵活性(例如,出于兼容性原因,需要对XML进行精确控制时)。