6

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

1. 如果我有这个:

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

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

它给出以下输出(名称属性序列化为元素):

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

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

4

2 回答 2

7

属性不会在覆盖的属性上继承。你需要重新声明它们。同样在您的第一个示例中,行为不是您在接口级别声明 XmlAttribute 的“预期”行为,但序列化的 xml 包含作为元素的值。所以接口中的属性被忽略,只有从实际类中获取的信息才重要。

于 2012-11-01T17:32:36.577 回答
7

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

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

public class NamedDerived : NamedBase
{
    [XmlAttribute]
    public override string Name { get; set; }
}
于 2012-11-01T17:41:30.897 回答