6

今日、私を混乱させる何かを見つけました:

1.これがある場合:

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

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

次の出力が得られます (要素としてシリアル化された Name プロパティ)。

<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

抽象クラス プロパティを 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 に答える
7

オーバーライドされたプロパティでは、属性は継承されません。それらを再宣言する必要があります。また、最初の例では、インターフェイス レベルで XmlAttribute を宣言したため、動作は「期待される」ものではありませんが、シリアル化された xml には値が要素として含まれています。したがって、インターフェイスの属性は無視され、実際のクラスから取得した情報のみが重要になります。

于 2012-11-01T17:32:36.577 に答える