2011-11-21 17 views
13

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?

+0

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

Respuesta

1

Como mencionaste cuando solicitaste el servicio podría regresar. Entonces, ¿sabes si se realiza una solicitud para un tipo, entonces el servicio podría devolver solo ciertos tipos?

habría intentado XmlSerializer Constructor (Type, Type[]) ... Inicializa una nueva instancia de la clase XmlSerializer que puede serializar objetos del tipo especificado en documentos XML y deserializar documentos XML en un objeto del tipo especificado. Si una propiedad o campo devuelve una matriz, el parámetro extraTypes especifica los objetos que se pueden insertar en la matriz.

+1

Eso es correcto, puedo recomendar ciertos tipos, sus 3-4 tipos de differnet. He intentado construir con (Tipo, Tipo []) sin suerte ... en realidad es lo mismo que usar XmlIncludeAttribute. – Oyvind

Cuestiones relacionadas