我正在使用WCF與安全供應商服務進行通信,在VB NET中開發控制檯應用程序。我想序列化來自調用的請求和響應,並將它們存儲在XML文件中進行分析。不幸的是,我試圖序列化的對象很複雜。它基於SVCUTIL根據供應商提供的WSDL和xsd文件生成的類。svcutil生成的代碼需要xmlinclude
這裏是我所編寫的代碼(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
我添加的選項/ 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)}