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 に答える