[英]DataContractSerializer and deserializing web service response types
我正在使用調用Web服務並在客戶端上使用WCF生成的服務引用。 我已經保存了從測試服務接收到磁盤的XML響應(沒有SOAP信封和正文標記)我想從磁盤加載它們並從它們創建對象。 讓我們從我的網絡服務中采取以下方法:
SomeMethodResponse SomeMethod(SomeMethodRequest req)
我手動(通過SOAP UI)將響應保存到磁盤到文件,Sample響應:
<SomeMethodResponse xmlns="http://myNamespace">
<SomeMember1>value</SomeMember1>
</SomeMethodResponse>
然后我嘗試使用以下命令從文件反序列化對象:
DataContractSerializer dcs =
new DataContractSerializer(typeof(SomeMethodResponse))
這失敗了 - 序列化程序抱怨錯誤,它期望命名空間' http://schemas.datacontract.org/2004/07 '中的元素,但在' http:// myNamespace '中找到了元素。
問題:為什么DataContractSerializer
不使用在SomeMethodResponseType上使用XmlTypeAttribute(Namespace="http://myNamespace")
聲明的XmlTypeAttribute(Namespace="http://myNamespace")
?
我可以通過向DataContractSerializer
構造函數顯式提供命名空間和根元素來解決這個問題。 但它失敗的消息類似於:
行X位置Y(XMLdocument的最后一行)出錯。 'EndElement''SomeMethodResponse
來自命名空間'httpmyNapespace'不是預期的。 期待元素'someNameField'。
SomeName
是Web服務正在使用的XSD中的元素。 它也是SomeMethodResponse
類型的屬性,由名為someNameField
的私有字段someNameField
。 看起來DataContractSerializer
試圖除了屬性之外反序列化字段。
如何取消已從磁盤保存的XML並取回SomeMethod返回的相同類型的對象?
謝謝,馬特拉
您的XML響應顯然具有XML命名空間:
<SomeMethodResponse xmlns="http://myNamespace">
<SomeMember1>value</SomeMember1>
</SomeMethodResponse xmlns="http://myNamespace">
所以為了正確讀取和反序列化,你需要告訴你的DataContractSerializer這個命名空間:
DataContractSerializer dcs =
new DataContractSerializer(typeof(SomeMethodResponse),
"SomeMethodResponse", "http://myNamespace")
通過在構造函數中指定此默認XML命名空間,它應該能夠立即讀取和反序列化此XML。
你得到的另一個錯誤:
行X位置Y(XMLdocument的最后一行)出錯。 'EndElement''命名空間'httpmyNapespace'中的SomeMethodResponse不是預期的。 期待元素'someNameField'。
是由非常不尋常的,從未見過的事實導致你的end元素有一個命名空間........
</SomeMethodResponse xmlns="http://myNamespace">
只是刪除多余的不必要的命名空間,你應該沒事!
</SomeMethodResponse>
讓我回答一下我自己的問題:第二個錯誤信息的原因是,實際上,svcUtil已經默默地選擇使用DataContractSerializer
XmlSerializer
。 我通過閱讀XmlTypeAttribute
的幫助找到了這XmlTypeAttribute
- MSDn狀態控制XmlSerializer序列化屬性目標時生成的XML模式。 ;-)所以我們回到舊的, XmlSerializer
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.