Atributos xml en interfaces y clases abstractas.

Encontré algo que me confundió hoy:

1. Si tengo esto:

public interface INamed { [XmlAttribute] string Name { get; set; } } public class Named : INamed { public string Name { get; set; } } 

Da la siguiente salida (Nombre propiedad serializada como elemento):

  Johan  

2. Si tengo esto:

 public abstract class NamedBase { [XmlAttribute] public abstract string Name { get; set; } } public class NamedDerived : NamedBase { public override string Name { get; set; } } 

El XmlSerializer lanza System.InvalidOperationException

El miembro ‘NamedDerived.Name’ oculta el miembro heredado ‘NamedBase.Name’, pero tiene diferentes atributos personalizados.

El código que utilicé para la serialización:

 [TestFixture] public class XmlAttributeTest { [Test] public void SerializeTest() { var named = new NamedDerived {Name = "Johan"}; var xmlSerializer = new XmlSerializer(named.GetType()); var stringBuilder = new StringBuilder(); using (var stringWriter = new StringWriter(stringBuilder)) { xmlSerializer.Serialize(stringWriter, named); } Console.WriteLine(stringBuilder.ToString()); } } 

Mi pregunta es:

¿Lo estoy haciendo mal y, en caso afirmativo, cuál es la forma correcta de usar atributos xml en interfaces y clases abstractas?

Los atributos no se heredan en las propiedades anuladas. Necesitas redeclarlos. También en su primer ejemplo, el comportamiento no es el “esperado” cuando declaró XmlAttribute en el nivel de interfaz y, sin embargo, el xml serializado contiene el valor como un elemento. Por lo tanto, el atributo en la interfaz se ignora y solo importa la información tomada de la clase real.

Creo que deberías xmlorear tu propiedad de clase abstracta

 public abstract class NamedBase { [XmlIgnore] public abstract string Name { get; set; } } public class NamedDerived : NamedBase { [XmlAttribute] public override string Name { get; set; } }