【问题标题】:Web API - Dynamic to XML serializationWeb API - 动态到 XML 序列化
【发布时间】:2013-09-23 03:48:20
【问题描述】:

我正在编写一个返回动态构造的属性包的 Web API Web 服务。是否有任何有效的序列化程序或如何将动态序列化为 XML 的方法?我试图寻找任何好的建议,但没有找到任何有用的建议。

【问题讨论】:

    标签: c# xml dynamic asp.net-web-api


    【解决方案1】:

    我们通过创建自定义 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);
                    });
            }
        }
    }
    

    【讨论】:

    • 这是一个绝妙的答案。这保证了如果您还使用 Newtonsoft Json 转换器,您将始终以两种格式输出相同的数据 - 无需标记所有模型。
    • 我建议将 JsonMediaTypeFormatter 参数添加到 CustomXmlFormatter。然后在调用 SerializeObject 时,传入 JsonMediaTypeFormatter.SerializerSettings。这将确保您使用相同的设置来创建 JSON 和 XML。
    • 对我来说,对于@Brian 上面提到的问题,这是一个非常优雅的解决方案:我希望我的 JSON 设置自定义能够延续到 XML 媒体类型;感谢分享这种方法,@Jakub! FWIW,我用实现编辑了答案,我最终得到了“数组”类型的解释,并解释了反序列化 XML 的能力。
    • 我喜欢这种生成的 XML 比内置格式化程序更好。但是,我发现该操作非常快,并且 System.Xml.XmlDocument 在异步代码中使用起来非常简单。我没有使用 Task.Factory.StartNew 来排队这个工作,而是从 BufferedMediaTypeFormatter 派生,发现在负载下没有性能差异,也没有为了遵守方法签名而创建 Task。
    猜你喜欢
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多