2011-07-19 19 views
6

Gần đây tôi đã bắt đầu sử dụng RestSharp để tiêu thụ một dịch vụ REST sử dụng XML.Sắp xếp lại một đối tượng khi đăng dữ liệu với RestSharp

Nó làm cho việc deserializing các đối tượng từ XML thành một tập hợp các đối tượng tùy chỉnh tầm thường. Nhưng câu hỏi của tôi là cách tốt nhất để reserialize khi đăng lại dịch vụ là gì?

Tôi có nên sử dụng LINQ-to-XML để reserialize không? Tôi đã thử sử dụng thuộc tính Serializeable và chức năng tiện ích SerializeToXml, nhưng khi tôi làm như vậy có vẻ như phá vỡ quá trình deserializing được thực hiện bởi RestSharp.

Trả lời

1

Trên một dự án gần đây, tôi đã sử dụng XElement (từ hội đồng System.Xml.Linq) để xây dựng các yêu cầu của tôi theo cách thủ công. Tôi chỉ có một số ít tài sản để giải quyết. RestSharp đã giải quyết vấn đề thực sự đã deserializing các phản hồi đồ thị XML lớn từ máy chủ.

Nếu mô hình đối tượng của bạn không giống với lược đồ XML, bạn sẽ phải tạo một mô hình đối tượng khác và ánh xạ tới đó, để nó có thể được tự động tuần tự, sử dụng một số thư viện. Trong tình huống đó, bạn có thể tốt hơn khi ánh xạ theo cách thủ công vào lược đồ.

+0

Cảm ơn câu trả lời của bạn! Có thể RestSharp serialize tự động nếu tên và thuộc tính của một lớp có cùng tên với các phần tử XML của chúng, hoặc bạn có nghĩa là sử dụng tuần tự hóa .NET thông qua các thuộc tính xml và sau đó sử dụng XmlSerializer? – Evan

1

RestSharp hỗ trợ một số serialization XML cơ bản mà bạn có thể ghi đè nếu cần thiết:

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

Cảm ơn! Việc xây dựng trong serialization XML chú ý đến các thuộc tính như [XmlElement ("elementname")]? Hoặc sẽ yêu cầu sử dụng serialization tùy chỉnh? – Evan

+1

Nó không. Tôi ghét các thuộc tính :). Bạn sẽ phải thực hiện ISerializer và vượt qua nó thông qua XmlSerializer cho rằng –

+0

@ JohnSheehan-Runscope Re: * "Tôi ghét các thuộc tính" * Có vẻ như bạn đã thay đổi ý định về điều này ... Tôi thấy rằng phiên bản hiện tại của RestSharp (105.2 .3.0) bao gồm thuộc tính [DeserializeAs] (https://github.com/restsharp/RestSharp/wiki/Deserialization). Và trong trình duyệt đối tượng trong Visual Studio, tôi cũng thấy bây giờ thấy một thuộc tính ** SerializeAs ** được tham chiếu trong [câu trả lời này] (http://stackoverflow.com/a/10726706/1497596). – DavidRR

3

tôi đã có thể sử dụng các thuộc tính để có được tất cả những gì tôi cần, mặc dù tình hình của tôi là tương đối đơn giản. Ví dụ, để làm cho nó deserialize nút với dấu gạch ngang trong họ, và sau đó để có thể serialize đến tên nút cùng tôi đã sử dụng này:

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

Vì vậy, trong ví dụ của bạn, serialization không tôn trọng [XmlElement("elementName")]. Thay vào đó, bạn sẽ cần phải sử dụng [SerializeAs(Name = "elementName")].

Tôi tìm thấy điều này bằng cách trolling thông qua mã thử nghiệm trong dự án RestSharp.

+0

Tôi không thích giải pháp này vì nó không giống như Chuẩn XML chuẩn. – jhilden

1

Sau khi xem mã nguồn cho RestSharp, tôi thấy rằng chúng thực sự có một trình bao bọc dựng sẵn cho System.Xml.Serialization.XmlSerializer có tên DotNetXmlSerializer, nó không được sử dụng theo mặc định. Để sử dụng, chỉ cần thêm dòng sau:

var request = new RestRequest(); 
request.RequestFormat = RequestFormat.Xml; 
request.XmlSerializer = new DotNetXmlSerializer(); 
request.AddBody(someObject); 
Các vấn đề liên quan