使用不同的XML序列化程序来读写对象:Asp.net web-api

时间:2012-09-20 08:19:14

标签: xml xml-serialization asp.net-mvc-4 asp.net-web-api

我想使用DataContractSerializer来序列化响应,并使用XmlSerializer来反序列化传入请求中的xml。可能吗?我知道我可以为不同的类型使用不同的序列化器,但我想要不同的序列化器进行读写。

1 个答案:

答案 0 :(得分:3)

这似乎是一个非常奇怪的要求,但是是的,这是可能的。您可以创建这样的自定义MediaType格式化程序:

public class DcsXsFormatter : MediaTypeFormatter
{
    public DataContractXmlFormatter()
    {
        SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("application/xml"));
        SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/xml"));
    }

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

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

    public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, 
                                                     HttpContent content, 
                                                     IFormatterLogger formatterLogger)
    {
        var task = Task<object>.Factory.StartNew(() =>
            {
                var ser = new XmlSerializer(type);
                return ser.Deserialize(readStream);
            });

        return task;
    }

    public override Task WriteToStreamAsync(Type type, object value, 
                                    Stream writeStream, 
                                    HttpContent content, 
                                    TransportContext transportContext)
    {            
        var task = Task.Factory.StartNew( () =>
            {                    
                var ser = new DataContractSerializer(type);
                ser.WriteObject(writeStream,value);                    
                writeStream.Flush();
            });

        return task;
    }
}

将其连接到global.asax:

//删除现有的XmlFormatter    config.Formatters.Remove(config.Formatters.XmlFormatter);

// Hook in your custom XmlFormatter
config.Formatters.Insert(0, new  DcsXsFormatter());

但你为什么要这样做?