DataContractSerializer
応答XmlSerializer
をシリアル化し、着信要求で xml を逆シリアル化するために使用したいと考えています。出来ますか?タイプごとに異なるシリアライザーを使用できることはわかっていますが、読み取りと書き込みには異なるシリアライザーが必要です。
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 に答える