簡體   English   中英

DataContractSerializer和反序列化Web服務響應類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM