2013-09-23 57 views
6

我正在編寫一個Web API Web服務,它正在返回動態構建的屬性包。有沒有工作的序列化程序或如何將動態序列化到XML?我試圖尋找任何好的建議,但沒有發現任何可用的東西。Web API - 動態到XML序列化

回答

18

我們通過創建自定義XML格式化程序來解決它。

這不是一個理想的解決方案,但它的工作原理。

Global.asax

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

創建一個名爲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

新類這是一個夢幻般的答案。這保證瞭如果您還使用Newtonsoft Json轉換器,您將始終用兩種格式輸出相同的數據 - 而不必標記所有模型。 –

+1

我建議添加一個JsonMediaTypeFormatter參數給CustomXmlFormatter。然後當你調用SerializeObject時,傳進JsonMediaTypeFormatter.SerializerSettings。這將確保您使用相同的設置來創建JSON和XML。 – Brian

+0

對於我來說,這是@Brian上面提到的問題的一個非常優雅的解決方案:我想讓我的JSON設置自定義轉換爲XML媒體類型;感謝分享這個方法,@Jakub! FWIW,我編輯了實現的答案,最終我以「數組」類型的帳戶結束了帳戶,並說明了對XML進行反序列化的能力。 –