2013-09-23 120 views
6

Tôi đang viết một dịch vụ web API Web đang trả lại túi thuộc tính được tạo động. Có serializer làm việc hoặc một cách làm thế nào để serialize năng động để XML? Tôi đã cố gắng tìm kiếm những gợi ý hay nhưng không tìm thấy bất cứ thứ gì có thể sử dụng được.API Web - Nối tiếp động với XML

Trả lời

18

Chúng tôi đã giải quyết nó bằng cách tạo trình định dạng XML tùy chỉnh.

Đây không phải là giải pháp lý tưởng nhưng nó hoạt động.

Trong Global.asax

GlobalConfiguration.Configuration.Formatters.Add(new CustomXmlFormatter()); 
GlobalConfiguration.Configuration.Formatters 
    .Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter); 

Tạo một lớp mới gọi là CustomXmlFormatter

using System; 
using System.IO; 
using System.Net.Http.Formatting; 
using System.Net.Http.Headers; 
using System.Threading.Tasks; 
using Newtonsoft.Json; 

namespace EMP.WebServices.api.Formatters 
{ 
    public class CustomXmlFormatter : MediaTypeFormatter 
    { 
     public CustomXmlFormatter() 
     { 
      SupportedMediaTypes.Add(
       new MediaTypeHeaderValue("application/xml")); 
      SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/xml")); 
     } 

     public override bool CanReadType(Type type) 
     { 
      if (type == (Type)null) 
       throw new ArgumentNullException("type"); 

      return true; 
     } 

     public override bool CanWriteType(Type type) 
     { 
      return true; 
     } 

     public override Task WriteToStreamAsync(Type type, object value, 
      Stream writeStream, System.Net.Http.HttpContent content, 
      System.Net.TransportContext transportContext) 
     { 
      return Task.Factory.StartNew(() => 
       { 
         var json = JsonConvert.SerializeObject(value); 

         var xml = JsonConvert 
          .DeserializeXmlNode("{\"Root\":" + json + "}", ""); 

         xml.Save(writeStream); 
       }); 
     } 
    } 
} 
+3

Đó là một câu trả lời tuyệt vời. Điều này đảm bảo rằng nếu bạn cũng đang sử dụng bộ chuyển đổi Newtonsoft Json, bạn sẽ luôn luôn kết thúc với cùng một dữ liệu được xuất ra bởi cả hai định dạng - mà không cần phải đánh dấu tất cả các mô hình của bạn. –

+1

Tôi sẽ đề xuất thêm tham số JsonMediaTypeFormatter vào CustomXmlFormatter. Sau đó, khi bạn gọi SerializeObject, vượt qua trong JsonMediaTypeFormatter.SerializerSettings. Điều này sẽ đảm bảo bạn sử dụng cùng một cài đặt để tạo cả JSON và XML. – Brian

+0

Đối với tôi, đây là một giải pháp thực sự thanh lịch cho vấn đề mà @Brian đề cập ở trên: Tôi muốn các tùy chỉnh cài đặt JSON của tôi để chuyển sang loại phương tiện XML; cảm ơn vì đã chia sẻ cách tiếp cận này, @Jakub! FWIW, tôi đã chỉnh sửa câu trả lời với việc triển khai cuối cùng tôi đã kết thúc với các tài khoản đó cho các loại "mảng" và các tài khoản cho khả năng deserialize XML. –