svcutil生成的代码需要xmlinclude

时间:2014-03-27 16:09:32

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

我正在使用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方法时,我得到一个带有InnerException消息的InvalidOperationException:'不期望类型[生成的类名]。使用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

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

This thread讨论了svcutil的/ reference选项。我不知道这是否会有所帮助,我不确定该路径的具体内容。 This reference表示/ reference对我的XMLSerializer问题没有帮助。

这里似乎是another thread。任何指导肯定会受到赞赏。


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

x = New XmlSerializer(obj.GetType, extraTypes)

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

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

1 个答案:

答案 0 :(得分:0)

使用xmlserializer方法的extraType参数。查看原始帖子中包含的更新评论。