2014-03-27 51 views
0

我正在使用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)} 

回答

0

使用xmlserializer方法的extraType參數。查看原始文章中包含的更新評論。

相關問題