c# - 接口(interface)和抽象类中的 Xml 属性

标签 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; }
}

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

<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

Member 'NamedDerived.Name' hides inherited member 'NamedBase.Name', but has different custom attributes.

我用来连载的代码:

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

我的问题是:

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

最佳答案

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

关于c# - 接口(interface)和抽象类中的 Xml 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13182420/

相关文章:

java - 实现线程接口(interface)

Golang 类型系统不一致(http包)

xml - 如何在 Scala 中处理 XML 字符引用?

java - 导出为 XML,包括嵌入式类

c# - 即使控件没有定义 ContextMenu,也会引发 ContextMenuOpening 事件

c# - 查找在列表中恰好出现两次的重复项

在方法声明中使用时的 C# 接口(interface)

c# - 用于 Xml 序列化的 XmlRoot() 不起作用

c# - C#中的多重继承

c# - 如何将文件从一个 SP 2010 根站点复制到其子站点 (C#)