【发布时间】: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