2012-11-26 32 views
7

EDIT: khoảnh khắc tôi hỏi những câu hỏi tôi thougt cố gắng một cái gì đó .. tôi đã thiết lập thuộc tính XmlNamespace theo yêu cầu và điều đó đã làm các trick ..RestSharp Deserialize trả về thuộc tính rỗng nhưng xml.deserialize kiểm tra hoạt động

request.XmlNamespace = "http://musicbrainz.org/ns/mmd-2.0#"; 

Nhưng tôi thực sự không hiểu là tại sao ...

vấn đề kế tiếp là nhận RestSharp nhận atributes xml như thuộc tính đối tượng


Tôi đã đi qua điều này cho hầu hết các ngày cuối tuần và tôi chỉ không làm cho nó hoạt động.

Tôi đang cố viết một trình bao bọc tròn một dịch vụ web RestFul (MusicBrainz). Tôi đang thử nghiệm với một ví dụ đơn giản: lấy chi tiết của một nghệ sĩ và đặt nó vào một đối tượng Nghệ sĩ tùy chỉnh.

Khi tôi thực hiện một thực thi trên RestClient nó kết thúc ok nhưng thuộc tính đối tượng của tôi là null .. Nhưng khi tôi kiểm tra deserialization với XmlDeserializer các objectproperties được lấp đầy (nhưng không cho thuộc tính tương ứng với một thuộc tính, nhưng tôi sẽ giải quyết vấn đề này sau)

Điều gì sẽ xảy ra giữa quá trình deserialization của phản hồi và đưa đối tượng vào response.data? Khá có thể nó là một lỗi "newbie" Tôi làm như thế này là những bước đi đầu tiên của tôi với RestSharp ..

Trợ giúp sẽ được nhiều đánh giá cao ..

Returnded xml:

<metadata> 
    <artist type="Group" id="f1548c5b-329e-4036-921c-02213a04b525"> 
     <name>Uriah Heep</name> 
      <sort-name>Uriah Heep</sort-name> 
      <country>GB</country> 
      <life-span> 
       <begin>1970</begin> 
      </life-span> 
    </artist> 
</metadata> 

My lớp:

public class Artist 
{ 
    public int Id { get; set; } 
    public string Type { get; set; } 
    public string Name { get; set; } 
    public string SortName { get; set; } 
    public string Country { get; set; } 

} 

Trong các thuộc tính sản lượng mã sau đây được điền

var output = xml.Deserialize<Artist>(response); 

Nhưng phản ứng tương tự không điền tính khi gọi

var response = client.Execute<T>(request); 

mã hoàn chỉnh (tôi đã đặt mã thử nghiệm trong phương pháp chung cho lợi ích của sự đơn giản):

public T Execute<T>(RestRequest request) where T : new() 
{ 
    var client = new RestClient(); 
    client.BaseUrl = BaseUrl; 
    client.Authenticator = null; 

    //does not fill properties 
    var response = client.Execute<T>(request); 

    if (response.ErrorException != null) 
    { 
     throw response.ErrorException; 
    } 
    var xml = new XmlDeserializer(); 

    //fills properties 
    var output = xml.Deserialize<Artist>(response); 

    return response.Data; 
} 
+1

Tôi tìm thấy giải pháp mà tôi muốn được quan tâm :-) –

+0

@AndersBornholm. Đã lâu rồi tôi mới thực hiện một số công việc trong dự án này. Nhưng như xa một bộ nhớ của tôi đi "giải pháp" là để thiết lập một không gian tên trên yêu cầu RestSharp .. Nếu bạn đang thực sự tuyệt vọng tôi có thể đào lên các dự án và có được một cái nhìn gần hơn ... – FasterRaf

+0

Tôi thực sự đã không làm việc trên dự án của tôi trong một thời gian dài. Tôi giải quyết nó bằng cách sử dụng một cái gì đó khác hơn là restsharp nếu tôi nhớ chính xác :-) –

Trả lời

0

này xảy ra bởi vì phương pháp Execute, sau khi nhận được phản hồi, hãy thử thương lượng dựa trên các thuộc tính RootElement và XmlNamespace của yêu cầu và sao chép chúng vào số XmlDeserializer.

Dưới đây là một mã from RestClient:

 handler.RootElement = request.RootElement; 
    handler.DateFormat = request.DateFormat; 
    handler.Namespace = request.XmlNamespace; 
    response.Data = handler.Deserialize<T>(raw); 

Nếu bạn vượt qua một RestRequest với một XmlNamespace mismatching, RestSharp của XmlDeserializer (có sử dụng XDocument đằng sau hậu trường) sẽ không thể để lập bản đồ XML đối phó với một đối tượng tài sản và bạn sẽ nhận được các giá trị mặc định/null thay thế.

Bây giờ cho thực hiện mặc định (khi bạn tạo XmlDeserializer bằng tay), nếu bạn không đặt một XmlNamespace, deserializer sẽ làm một tính năng tự động phát hiện rằng về cơ bản bỏ qua tất cả không gian tên trong phản ứng và bản đồ tất cả các thuộc tính chỉ bằng tên của họ .

mã nguồn Xem from XmlDeserializer:

 // autodetect xml namespace 
    if (!Namespace.HasValue()) 
    { 
     RemoveNamespace(doc); 
    } 

Lấy tất cả ở trên vào tài khoản, thì rõ ràng lý do tại sao nó bắt đầu làm việc sau khi bạn thiết lập một cách rõ ràng tài sản XmlNamespace đến một không gian tên tương ứng trong đối tượng yêu cầu của bạn với dòng này:

 request.XmlNamespace = "http://musicbrainz.org/ns/mmd-2.0#"; 

Execute không gian tên được sao chép của phương thức vào deserializer và nó ánh xạ XML để đối tượng một cách thích hợp.