c# - Cómo deserializar XML si el tipo de retorno podría ser un objeto de Error o Éxito
serialization (1)
En situaciones en las que tiene una secuencia XML que contiene uno de varios tipos de documentos posibles, puede construir un
XmlSerializer
para cada tipo y llamar a
XmlSerializer.CanDeserialize(XmlReader)
para probar sucesivamente si el documento se puede deserializar en ese tipo.
Este método no avanza el
XmlReader
allá del elemento raíz, por lo que puede llamarse varias veces sin volver a leer la secuencia.
Por ejemplo, podría presentar el siguiente método de extensión:
public static partial class XmlSerializerExtensions
{
public static object DeserializePolymorphicXml(this string xml, params Type[] types)
{
using (var textReader = new StringReader(xml))
{
return textReader.DeserializePolymorphicXml(types);
}
}
public static object DeserializePolymorphicXml(this TextReader textReader, params Type[] types)
{
if (textReader == null || types == null)
throw new ArgumentNullException();
var settings = new XmlReaderSettings { CloseInput = false }; // Let caller close the input.
using (var xmlReader = XmlReader.Create(textReader, settings))
{
foreach (var type in types)
{
var serializer = new XmlSerializer(type);
if (serializer.CanDeserialize(xmlReader))
return serializer.Deserialize(xmlReader);
}
}
throw new XmlException("Invalid root type.");
}
}
Luego úsalo de la siguiente manera:
var xmlBody = result.ResponseBody.DeserializePolymorphicXml(typeof(SuccessResponse), typeof(FailResponse));
if (xmlBody is SuccessResponse)
{
// Handle successful response
}
else if (xmlBody is FailResponse)
{
// Handle failed response
}
else
{
// unknown response
throw new InvalidOperationException("unknown response");
}
fiddle muestra.
Estoy trabajando con una API basada en XML que, como su nodo raíz, puede devolver un
SuccessResponse
o un
ErrorResponse
.
Estoy usando lo siguiente para deserializar los datos, pero no estoy seguro de cómo manejar el caso de que la devolución no sea una
SuccessResponse
.
¿Cuál es la mejor manera de manejar la situación en la que el XML devuelto no está en el formato esperado?
Sé que podría hacer un truco y buscar la aparición de
SuccessResponse
o
ErrorResponse
pero eso no se siente bien.
TheIconicApiResult result = this.apiService.SendGetRequest("GetProducts", new List<AbstractParam>() { new FilterParam("live"), new LimitParam(5000) });
IXmlSerialiser xmlSerialiser = new XmlSerialiser();
var xmlBody = xmlSerialiser.ParseXML<SuccessResponse>(result.ResponseBody);
public TObject ParseXML<TObject>(string xml)
{
using (TextReader reader = new StreamReader(GetMemoryStream(xml)))
{
XmlSerializer serialiser = new XmlSerializer(typeof(TObject));
return (TObject)serialiser.Deserialize(reader);
}
}