接口和抽象类中的Xml属性

时间:2012-11-01 17:30:37

标签: c# interface xml-serialization abstract custom-attributes

我今天发现了让我困惑的事情:

 1.如果我有这个:

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

public class Named : INamed
{
    public string Name { get; set; }
}

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

<Named>
  <Name>Johan</Name>
</Named>

 如果我有这个:

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'隐藏继承成员'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属性的正确方法是什么?

2 个答案:

答案 0 :(得分:6)

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

public abstract class NamedBase
{
    [XmlIgnore]
    public abstract string Name { get; set; }
}

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

答案 1 :(得分:4)

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