2010-03-23 15 views
11

Tengo una clase base con una propiedad llamada Name, que tiene un atributo XmlText.Atributo XmlText en la clase base rompe la serialización

Cuando una clase heredada es serializado consigo una excepción diciendo:

Se ha producido un error que refleja el tipo '[nombre de tipo]'. ---> System.InvalidOperationException: No se puede serializar el objeto de tipo '[tipo nombre]'. El tipo de base '[nombre de tipo base]' tiene contenido simple y solo puede ser extendido agregando elementos XmlAttribute . Considere cambiar Miembro XmlText de la clase base a matriz de cadenas.

Aquí están mis definiciones de clase, el error se produce al serializar a xml.

[Serializable] 
public class LookupItem 
{ 
    [System.Xml.Serialization.XmlAttribute()] 
    public int ID { get; set; } 

    [System.Xml.Serialization.XmlText()] 
    public string Name { get; set; } 
} 

[Serializable] 
public class Vendor : LookupItem 
{ 
    public string ContactNumber { get; set; } 
} 

[Serializable] 
public class Vendors : List<Vendor> 
{ 

} 

Respuesta

15

Parece ocurrir porque la clase LookupItem no tiene elemento secundario en su representación XML. Por eso, XmlSerializer lo considera un elemento XML simpleContent. Si agrega una nueva propiedad al LookupItem, que se serializará como un elemento XML, funciona bien.

que acabamos de pasar unos minutos mirando el XML disponibles los atributos de serialización, pero no pude encontrar ninguna que permitiría a especificar que el tipo no es un elemento simpleContent ...

Así que creo que se podría haz que funcione agregando una propiedad ficticia o un campo que nunca usas en la clase LookupItem. Si nunca le asigna un valor, permanecerá nulo y no se serializará, pero evitará que su clase se trate como simpleContent. Sé que es una solución sucia, pero no veo otra manera fácil ...

public class LookupItem 
{ 
    [System.Xml.Serialization.XmlAttribute()] 
    public int ID { get; set; } 

    [System.Xml.Serialization.XmlText()] 
    public string Name { get; set; } 

    public object _dummy; 
} 

(Por cierto, cabe destacar que el atributo Serializable no es necesario para la serialización XML.)

De todos modos, lo que realmente necesita serializar Name como texto XML? Eso es bastante raro, generalmente los elementos XML tienen contenido simple (texto) o elementos secundarios ... Una combinación de ambos hace que el XML sea más difícil de leer, así que a menos que se vea obligado a hacerlo, le sugiero que serialice Name como un atributo o elemento niño.

Cuestiones relacionadas