1

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

4

1 回答 1

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());

但是你为什么要这样做呢?

于 2012-09-20T09:33:20.700 回答