【问题标题】:svcutil generated code needs xmlincludesvcutil生成的代码需要xmlinclude
【发布时间】:2014-05-06 18:07:42
【问题描述】:

我正在使用与安全供应商服务通信的 WCF 在 VB NET 中开发控制台应用程序。我想序列化来自调用的请求和响应,并将它们存储在 XML 文件中以供分析。不幸的是,我试图序列化的对象很复杂。它基于 SVCUTIL 从供应商提供的 WSDL 和 xsd 文件生成的类。

这是我写的代码(obj是复杂对象):

Dim sr As StreamWriter
Dim x As XmlSerializer

sr = New StreamWriter("U:\logs\Responses.xml")
x = New XmlSerializer(obj.GetType)
x.Serialize(sr, obj)

当我点击 Serialize 方法时,我收到 InvalidOperationException 和 InnerException 消息:'类型 [生成的类名] 不是预期的。使用 XmlInclude 或 SoapInclude 属性来指定静态未知的类型。'

如前所述,这只是 SVCUTIL 生成并合并到我的应用程序中的几个类之一。有没有办法让 SVCUTIL 为所有这些类发出 XMLInclude 属性? WSDL 可能会被供应商更改,我不想在这样做时不得不再次手动添加所有这些类的属性。

SVCUTIL 为每个类生成的属性通常如下所示:

<System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.0.30319.1"),  _
 System.SerializableAttribute(),  _
 System.Diagnostics.DebuggerStepThroughAttribute(),  _
 System.ComponentModel.DesignerCategoryAttribute("code"),  _
 System.Xml.Serialization.XmlTypeAttribute([Namespace]:="[Vendor Specific].xsd")>

这是我目前用来生成代理类的命令:

svcutil *.wsdl *.xsd /language:vb /async /tcv:Version35 /out:VendorAsync.vb /config:VendorAsync.config

我在上面的命令中添加了选项 /ImportXMLTypes /SER:XMLSerializer ,而生成的代理类没有变化。

This thread 讨论了 svcutil 的 /reference 选项。我不知道这是否会有所帮助,而且我不确定要为路径指定什么。 This reference 建议 /reference 不会帮助解决我的 XMLSerializer 问题。

这里是another thread,似乎很相关。任何指导都将不胜感激。


我发现 this thread 确实帮助我最终解决了序列化程序问题!它现在就像一个魅力。基本上,您需要做的就是使用 extraTypes 参数调用序列化程序方法,如下所示:

x = New XmlSerializer(obj.GetType, extraTypes)

ExtraTypes 是一个类型数组,因为所有类型都包含在 SVCUTIL 创建的代理类中,所以我可以很容易地构建它。

Dim extraTypes As Type() = 
   {GetType(type1),
    GetType(type2),
    GetType(type3),
    GetType(type4)}

【问题讨论】:

    标签: vb.net wcf serialization wsdl svcutil.exe


    【解决方案1】:

    使用 xmlserializer 方法的 extraType 参数。请参阅原始帖子中包含的更新后的 cmets。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-23
      • 2020-09-22
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多