1
我想使用DataContractSerializer
來序列化響應和XmlSerializer
來反序列化傳入請求中的xml。可能嗎?我知道我可以爲不同的類型使用不同的序列化器,但是我需要不同的序列化器來讀寫。使用不同的XML序列化程序來讀寫對象:Asp.net web-api
我想使用DataContractSerializer
來序列化響應和XmlSerializer
來反序列化傳入請求中的xml。可能嗎?我知道我可以爲不同的類型使用不同的序列化器,但是我需要不同的序列化器來讀寫。使用不同的XML序列化程序來讀寫對象:Asp.net web-api
這似乎是一個非常奇怪的請求,但是,這是可能的。您可以創建自定義的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());
但是,您爲什麼要這麼做?
只是愚蠢的想法通過我的腦海:) –