今日、私を混乱させる何かを見つけました:
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属性を使用する正しい方法は何ですか?