接口和抽象类中的Xml属性

我今天发现了一些困扰我的东西:

1.如果我有这个:

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

它提供以下输出(Name属性序列化为元素):

  Johan  

2.如果我有这个:

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

XmlSerializer抛出System.InvalidOperationException

成员’NamedDerived.Name’隐藏inheritance的成员’NamedBase.Name’,但具有不同的自定义属性。

我用于序列化的代码:

 [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()); } } 

我的问题是:

我做错了,如果是这样,在接口和抽象类中使用xml属性的正确方法是什么?

属性不会在重写属性上inheritance。 你需要重新声明它们。 同样在第一个示例中,当您在接口级别声明XmlAttribute并且序列化的xml包含值作为元素时,行为不是“预期的”行为。 因此,界面中的属性将被忽略,只有从实际类中获取的信息才会起作用。

我认为你应该xmlignore你的抽象类属性

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