[Resolves #1744] Cleanup Xml Serializer & DataContractSerializer input and output formatters.

This commit is contained in:
Anthony Sneed 2015-01-26 16:46:32 +01:00 committed by Kiran Challa
parent 70efc5ae0a
commit c6de763a6c
2 changed files with 37 additions and 16 deletions

View File

@ -106,7 +106,7 @@ namespace Microsoft.AspNet.Mvc.Xml
return GetDefaultValueForType(context.ModelType); return GetDefaultValueForType(context.ModelType);
} }
return await ReadInternal(context); return await ReadInternalAsync(context);
} }
/// <summary> /// <summary>
@ -121,12 +121,23 @@ namespace Microsoft.AspNet.Mvc.Xml
} }
/// <summary> /// <summary>
/// Called during deserialization to get the <see cref="XmlObjectSerializer"/>. /// Gets the type to which the XML will be deserialized.
/// </summary> /// </summary>
/// <returns>The <see cref="XmlObjectSerializer"/> used during deserialization.</returns> /// <param name="declaredType">The declared type.</param>
protected virtual XmlObjectSerializer CreateDataContractSerializer(Type type) /// <returns>The type to which the XML will be deserialized.</returns>
protected virtual Type GetSerializableType([NotNull] Type declaredType)
{ {
return new DataContractSerializer(SerializableErrorWrapper.CreateSerializableType(type), _serializerSettings); return SerializableErrorWrapper.CreateSerializableType(declaredType);
}
/// <summary>
/// Called during deserialization to get the <see cref="DataContractSerializer"/>.
/// </summary>
/// <param name="type">The type of object for which the serializer should be created.</param>
/// <returns>The <see cref="DataContractSerializer"/> used during deserialization.</returns>
protected virtual DataContractSerializer CreateSerializer([NotNull] Type type)
{
return new DataContractSerializer(type, _serializerSettings);
} }
private object GetDefaultValueForType(Type modelType) private object GetDefaultValueForType(Type modelType)
@ -139,16 +150,16 @@ namespace Microsoft.AspNet.Mvc.Xml
return null; return null;
} }
private Task<object> ReadInternal(InputFormatterContext context) private Task<object> ReadInternalAsync(InputFormatterContext context)
{ {
var type = context.ModelType;
var request = context.ActionContext.HttpContext.Request; var request = context.ActionContext.HttpContext.Request;
using (var xmlReader = CreateXmlReader(new DelegatingStream(request.Body))) using (var xmlReader = CreateXmlReader(new DelegatingStream(request.Body)))
{ {
var xmlSerializer = CreateDataContractSerializer(type); var type = GetSerializableType(context.ModelType);
var deserializedObject = xmlSerializer.ReadObject(xmlReader); var dataContractSerializer = CreateSerializer(type);
deserializedObject = SerializableErrorWrapper.UnwrapSerializableErrorObject(type, deserializedObject); var deserializedObject = dataContractSerializer.ReadObject(xmlReader);
deserializedObject = SerializableErrorWrapper.UnwrapSerializableErrorObject(context.ModelType, deserializedObject);
return Task.FromResult(deserializedObject); return Task.FromResult(deserializedObject);
} }
} }

View File

@ -70,7 +70,7 @@ namespace Microsoft.AspNet.Mvc.Xml
} }
return SupportedMediaTypes return SupportedMediaTypes
.Any(supportedMediaType => supportedMediaType.IsSubsetOf(requestContentType)); .Any(supportedMediaType => supportedMediaType.IsSubsetOf(requestContentType));
} }
/// <summary> /// <summary>
@ -86,7 +86,17 @@ namespace Microsoft.AspNet.Mvc.Xml
return GetDefaultValueForType(context.ModelType); return GetDefaultValueForType(context.ModelType);
} }
return await ReadInternal(context); return await ReadInternalAsync(context);
}
/// <summary>
/// Gets the type to which the XML will be deserialized.
/// </summary>
/// <param name="declaredType">The declared type.</param>
/// <returns>The type to which the XML will be deserialized.</returns>
protected virtual Type GetSerializableType([NotNull] Type declaredType)
{
return SerializableErrorWrapper.CreateSerializableType(declaredType);
} }
/// <summary> /// <summary>
@ -106,7 +116,7 @@ namespace Microsoft.AspNet.Mvc.Xml
/// <returns>The <see cref="XmlSerializer"/> used during deserialization.</returns> /// <returns>The <see cref="XmlSerializer"/> used during deserialization.</returns>
protected virtual XmlSerializer CreateXmlSerializer(Type type) protected virtual XmlSerializer CreateXmlSerializer(Type type)
{ {
return new XmlSerializer(SerializableErrorWrapper.CreateSerializableType(type)); return new XmlSerializer(type);
} }
private object GetDefaultValueForType(Type modelType) private object GetDefaultValueForType(Type modelType)
@ -119,16 +129,16 @@ namespace Microsoft.AspNet.Mvc.Xml
return null; return null;
} }
private Task<object> ReadInternal(InputFormatterContext context) private Task<object> ReadInternalAsync(InputFormatterContext context)
{ {
var type = context.ModelType;
var request = context.ActionContext.HttpContext.Request; var request = context.ActionContext.HttpContext.Request;
using (var xmlReader = CreateXmlReader(new DelegatingStream(request.Body))) using (var xmlReader = CreateXmlReader(new DelegatingStream(request.Body)))
{ {
var type = GetSerializableType(context.ModelType);
var xmlSerializer = CreateXmlSerializer(type); var xmlSerializer = CreateXmlSerializer(type);
var deserializedObject = xmlSerializer.Deserialize(xmlReader); var deserializedObject = xmlSerializer.Deserialize(xmlReader);
deserializedObject = SerializableErrorWrapper.UnwrapSerializableErrorObject(type, deserializedObject); deserializedObject = SerializableErrorWrapper.UnwrapSerializableErrorObject(context.ModelType, deserializedObject);
return Task.FromResult(deserializedObject); return Task.FromResult(deserializedObject);
} }
} }