在WCF代理生成的客户端中,什么决定了所使用的序列化程序?

时间:2012-06-14 13:28:16

标签: wcf serialization wsdl datacontract svcutil.exe

当我使用DataContact / DataMember属性公开WCF服务时,我在此服务的其他项目中创建的每个服务引用都会生成具有DataContract / DataMember属性的类(以及IExtensibleDataObject接口实现等)。

在另一个项目中,我必须使用一个SOAP服务,其WSDL尚未由WCF生成,但是使用其他一些我不知道且不能改变行为的工具。

我的问题是我的svcutil代理生成的代码灵活性稍差:

  • 类使用Serializable属性而不是DataContract(GeneratedCode属性指定使用System.Xml而不是System.Runtime.Serialization)
  • 未实现IExtensibleDataObject
  • 未使用OptionalField属性
  • XmlElement的顺序是固定的,当在wsdl xs:sequence中插入新的xs:元素时,导致反序列化失败...

我使用的svcutil工具/ wsdl发生了什么,它必须以这种方式生成代码?

1 个答案:

答案 0 :(得分:1)

  

svcutil工具/我使用的wsdl发生了什么,它必须   以这种方式生成代码?

Svcutil.exe工具可用于为WCF和ASMX服务创建客户端代理。当使用Svcutil.exe从ASMX服务创建代理时,代码中生成的数据类型通常使用XML序列化。

http://msdn.microsoft.com/en-us/library/cc304837.aspx

<强>更新

我最好的猜测是,WSDL中指定的模式决定了svcutil.exe必须使用哪个序列化。

数据合同序列化架构的命名空间为http://schemas.microsoft.com/2003/10/Serialization,您可以获得有关该here的更多详细信息。

因此,如果svcutil看到wsdl中指定的这个模式,那么它将用于数据协定序列化器,而不是xml序列化器。

我还检查了WCF和ASMX的WSDL。 WCF服务的WSDL包含以下XSD部分,它们在ASMX中缺失。

<xsd:schema targetNamespace="http://tempuri.org/Imports">

   <xsd:import schemaLocation="http://localhost:53328/Service1.svc?xsd=xsd0"
     namespace="http://tempuri.org/"/>

   <xsd:import schemaLocation="http://localhost:53328/Service1.svc?xsd=xsd1" 
     namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>

   <xsd:import schemaLocation="http://localhost:53328/Service1.svc?xsd=xsd2" 
      namespace="http://schemas.datacontract.org/2004/07/WcfService1"/>
</xsd:schema>