为什么在使用预生成的XmlSerializer dll时会出现此序列化异常?

时间:2016-09-23 19:24:29

标签: c# soap msbuild .net-3.5 xml-serialization

我们的wsdl非常大,导致我们的H_full_size需要很长时间才能初始化。作为一个解决方案,它看起来像以前的开发人员使用类似于this solution的东西来创建一个预先生成的XML序列化代码的dll。

但是在使用wsdl时,我们在尝试使用继承类型时会出现异常异常。

例如,这是我的Web服务和基类的极简化版本:

SoapHttpClientProtocol

尝试调用接受namespace MW { [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Web.Services.WebServiceBindingAttribute(Name="MyWebServicePortBinding", Namespace="myNamespace")] [System.Xml.Serialization.XmlSerializerAssemblyAttribute(AssemblyName = "MyWebService.XmlSerializers")] public partial class MyWebService: System.Web.Services.Protocols.SoapHttpClientProtocol { ... } // XmlInclude attribute removed via script // [System.Xml.Serialization.XmlIncludeAttribute(typeof(MyChildClass))] [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(Namespace="myNamespace")] public abstract partial class MyBaseClass { } [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(Namespace="myNamespace")] public partial class MyChildClass : MyBaseClass { } } 作为参数的方法时,会导致异常

  

XML文档中存在错误

     

无法识别指定的类型:name ='MyChildClass',namespace ='myNamespace'

当然,解决方案是将MyBaseClass属性保留在我们的类中而不是删除它们,但随着时间的推移,这些属性的数量已经增长到它再次影响我们的Web服务对象的初始化时间的程度,我想知道是否有替代解决方案。

我对msbuild或编译器的工作原理并不陌生,到目前为止还没有找到与谷歌搜索类似的东西。我认为如果这是一个常见问题,那么很容易找到解决方案。所以现在我想知道编写我们的构建脚本的前一个开发人员是否错过了什么。

我们的构建脚本按以下顺序运行这组命令:

  • 从wsdl:[System.Xml.Serialization.XmlIncludeAttribute(typeof(MyChildClass))]
  • 生成Web服务
  • 使用所有序列化程序构建Web服务:wsdl.exe <webService>
  • 运行自定义脚本以从生成的webservice cs类文件中删除msbuild BuildWebservice1.xml属性
  • 在没有序列化程序属性的情况下再次构建webservice:[XmlInclude]

我认为msbuild的两个xml文件之间的唯一区别是第一个msbuild BuildWebservice2.xml属性设置为<GenerateSerializationAssemblies>,第二个On设置为Off,第二个包含引用到第一个。

<Reference Include="MyWebService.XmlSerializers, Version=1.0.0.41348, Culture=neutral, PublicKeyToken=2401953c7c666e82, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>Serializers\MyWebService.XmlSerializers.dll</HintPath>
</Reference>

对于使用带有继承类型的预生成序列化程序集,我是否缺少某些内容?

0 个答案:

没有答案