2011-07-19 25 views
6

ile veri gönderirken bir nesneyi seri hale getirin Son zamanlarda XML kullanan bir REST hizmeti kullanmak için RestSharp'ı kullanmaya başladım.RestSharp

Nesneleri XML'den, özel nesnelerin önemsiz bir koleksiyonuna seri hale getirmesini sağlar. Ama sorum, hizmete geri gönderirken 'u yeniden yayınlamanın en iyi yolu nedir?

Yeniden boyutlandırmak için LINQ-to-XML kullanmalı mıyım? Serializeable özniteliğini ve SerializeToXml yardımcı programı işlevini kullanmayı denedim, ancak bunu yaptığımda RestSharp tarafından gerçekleştirilen serileştirmeyi kırıyor gibi görünüyor.

cevap

1

Son bir projemde, isteklerimi el ile oluşturmak için XElement'i (System.Xml.Linq derlemesinden) kullandım. Bununla başa çıkmak için sadece bir avuç malım vardı. RestSharp, sunucudan büyük XML grafik yanıtlarını serileştiren asıl sorunu çözdü. Nesne modeliniz XML şemasına benzemediyse, başka bir nesne modeli oluşturmalısınız ve bununla eşlenecek, böylece bazı kitaplıkları kullanarak, otomatik olarak serileştirilecek şekilde oluşturmanız gerekecektir. Bu durumda, şemaya elle eşleme yapmak daha iyi olabilir. Ben istediğimi tüm almak için özelliklerini kullanmak mümkün olmuştur

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 
+0

Cevabınız için teşekkürler! RestSharp, bir sınıfın adı ve özellikleri XML öğeleriyle aynı ada sahipse veya xml öznitelikleriyle .NET serileştirmesini ve sonra XmlSerializer'ı kullanmak istediğinizde otomatik olarak serileştirebilir mi? – Evan

1

RestSharp gerekirse geçersiz kılabilirsiniz bazı temel XML seri destekler. Örneğin, ben bu kullanılan aynı düğüm adının seri hale getirmek mümkün o zaman onları tire ile düğümleri serisini almak ve:

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

Yani, örnekte, seri hale [XmlElement("elementName")] saygı göstermiyor. Bunun yerine, [SerializeAs(Name = "elementName")]'u kullanmanız gerekecektir.

Bunu RestSharp projesindeki test kodunda troll ederek buldum.

+1

Teşekkürler! Yerleşik XML serileştirme [XmlElement ("elementname")] gibi özelliklere dikkat ediyor mu? Yoksa özel serileştirmeyi mi gerektiriyor? – Evan

+1

Yapmıyor. Öznitelikten nefret ediyorum :). ISerializer'ı uygulamak ve –

+0

@ JohnSheehan-Runscope Re için XmlSerializer'dan geçirmeniz gerekir: * "Öznitelikten nefret ediyorum" * Bu konuda fikrinizi değiştirmişsiniz gibi görünüyor ... RestSharp'ın şu anki sürümünü görüyorum (105.2 .3.0) [DeserializeAs] (https://github.com/restsharp/RestSharp/wiki/Deserialization) özniteliğini içerir. Ve Visual Studio'daki nesne tarayıcısında, şimdi [bu yanıtta] başvurulan bir ** SerializeAs ** özniteliğini de görüyorum (http://stackoverflow.com/a/10726706/1497596). – DavidRR

3

, benim durumum oldukça basit olmasına rağmen:

+0

Bu çözümü sevmiyorum çünkü Standart XML Serileştirmesi ile aynı değil. – jhilden

1

RestSharp için kaynak koduna baktıktan sonra, aslında adlı System.Xml.Serialization.XmlSerializer için yerleşik bir sarmalayıcıya sahip olduğunu buldum, yalnızca varsayılan olarak kullanılmıyor. Bunu kullanmak için, şu satırı ekleyin:

var request = new RestRequest(); 
request.RequestFormat = RequestFormat.Xml; 
request.XmlSerializer = new DotNetXmlSerializer(); 
request.AddBody(someObject); 
İlgili konular