Estoy utilizando XmlSerializer para comunicarme con un servicio. Este no es un servicio SOAP regular, tiene sus propios tipos de objetos XML. Por ejemplo, puedo pedir un objeto <Capabilities>
, pero puede devolver un <Exception>
. Entonces, en otras palabras, tengo que lidiar con tipos de documentos XML aleatorios. Sin embargo, sé con qué tipos tengo que lidiar.Deserializar tipos aleatorios/desconocidos con XmlSerializer
Lo que trato de hacer es encontrar un enfoque genérico para serializar/deserializar estos documentos. El problema es que XmlSerializer necesita saber el tipo en la etapa de creación.
Estos no están encapsulados en un elemento raíz común, así que hacer una clase base y el uso del atributo [XmlInclude]
no funciona en este caso:
[XmlInclude(typeof(Exception))]
[XmlInclude(typeof(Capabilities))]
public abstract class BaseClass
{
public BaseClass()
{
SchemaLocation = "test";
}
[XmlAttribute("schemaLocation")]
public String SchemaLocation { get; set; }
}
[XmlRoot("Exception")]
public class Exception : BaseClass
{
public Exception():base()
{
}
[XmlElement]
public String Message { set; get; }
}
[XmlRoot("Capabilities")]
public class Capabilities : BaseClass
{
public Capabilities() : base()
{}
[XmlElement]
public String ServiceName { set; get; }
}
Mi solución hasta ahora es sondear el elemento raíz manualmente con el XmlReader, y luego asignarlo al tipo correcto antes de crear una instancia de XmlSerializer.
¿Hay alguna forma mejor de hacerlo?
Creo que su camino está bien. El XmlSerializer no funciona muy bien para modelos como el que está describiendo. hay algunos trucos para hacer esto de manera más genérica, pero dependen de que su 'BaseClass' esté encapsulada en un elemento raíz. Posiblemente podría agregar este elemento raíz alrededor de su xml y luego aplicar este método, o usar su XmlInclude. ver http://www.codeproject.com/KB/XML/xmlserializerforunknown.aspx – wal