2011-07-19 26 views
6

我最近開始使用RestSharp來使用使用XML的REST服務。使用RestSharp發佈數據時序列化對象

它使從XML的對象反序列化到一個自定義對象的集合不重要。但我的問題是什麼是重新序列化回發到服務時的最佳方式是什麼?

我應該使用LINQ-to-XML重新進行串行化嗎?我嘗試使用Serializeable屬性和SerializeToXml實用程序函數,但是當我這樣做時似乎打破了RestSharp執行的反序列化。

回答

1

在最近的一個項目中,我使用XElement(來自System.Xml.Linq程序集)手動構建我的請求。儘管如此,我只有少數幾個物業可以處理。 RestSharp解決了反序列化來自服務器的大型XML圖形響應的真正問題。

如果您的對象模型與XML模式不同,您將不得不創建另一個對象模型,並映射到該對象模型,以便可以使用某些庫自動序列化。在這種情況下,手動映射到模式可能會更好。

+0

感謝您的回答!如果一個類的名稱和屬性與它們的XML元素具有相同的名稱,那麼RestSharp可以自動序列化,還是指通過xml屬性使用.NET序列化,然後使用XmlSerializer? – Evan

1

RestSharp支持一些基本的XML序列化,這在需要時您可以覆蓋:

var request = new RestRequest(); 
request.RequestFormat = RequestFormat.Xml; 
request.XmlSerializer = new SuperXmlSerializer(); // optional override, implements ISerializer 
request.AddBody(person); // object serialized to XML using current XML serializer 
+1

謝謝!內置的XML序列化是否關注諸如[XmlElement(「elementname」)]等屬性?或者這需要使用自定義序列化? – Evan

+1

它沒有。我討厭屬性:)。你必須實現ISerializer並通過XmlSerializer傳遞給它 –

+0

@ JohnSheehan-Runscope回覆:*「我討厭屬性」*看起來你已經改變了這種想法......我看到當前版本的RestSharp(105.2 .3.0)包含[DeserializeAs](https://github.com/restsharp/RestSharp/wiki/Deserialization)屬性。而在Visual Studio中的對象瀏覽器中,我現在也可以看到在[此答案](http://stackoverflow.com/a/10726706/1497596)中引用的** SerializeAs **屬性。 – DavidRR

3

我已經能夠使用屬性來獲取所有的我需要什麼,儘管我的情況比較簡單。例如,要得到它的反序列化與破折號節點它們,然後才能夠序列化爲我用這同一個節點名稱:

[XmlElement(ElementName = "short-name")] 
[SerializeAs(Name = "short-name")] 
public string shortName { get; set; } 

所以,在你的榜樣,系列化不尊重[XmlElement("elementName")]。相反,您將需要使用[SerializeAs(Name = "elementName")]

我通過拖動RestSharp項目中的測試代碼發現了這個問題。

+0

我不喜歡這個解決方案,因爲它與標準XML序列化不一樣。 – jhilden

1

在查看RestSharp的源代碼後,我發現它們實際上有一個內置的包裝System.Xml.Serialization.XmlSerializer,名爲DotNetXmlSerializer,它只是默認情況下沒有使用。要使用它,只需添加以下行:

var request = new RestRequest(); 
request.RequestFormat = RequestFormat.Xml; 
request.XmlSerializer = new DotNetXmlSerializer(); 
request.AddBody(someObject); 
相關問題