XmlSerializer
クラスとその関連属性を使用してシリアライズしたいクラスの階層があります。基本抽象クラスがあり、その後にかなりの数の派生クラスがあります (以下のコードでは、派生クラスの数を 5 つに減らしましたが、実際のコードにはさらに多くのクラスがあります)。クラスは階層を形成し、多くの場合、階層内のクラスのインスタンスへの参照が含まれています。
public abstract class BaseType
{
// Only classes in my assembly can derive from this class
internal BaseType() { }
}
public sealed class TType : BaseType
{
[XmlText]
public string Name;
}
public sealed class PType : BaseType
{
[XmlElement("t", typeof(TType)]
[XmlElement("p", typeof(PType)]
[XmlElement("a", typeof(AType)]
[XmlElement("s", typeof(SType)]
[XmlElement("u", typeof(UType)]
public BaseType Child;
}
public sealed class SType : BaseType
{
[XmlElement("t", typeof(TType)]
[XmlElement("p", typeof(PType)]
[XmlElement("s", typeof(SType)]
[XmlElement("a", typeof(AType)]
[XmlElement("u", typeof(UType)]
public BaseType [] Items;
public string [] ItemNames;
}
public sealed class AType : BaseType
{
[XmlElement("t", typeof(TType)]
[XmlElement("p", typeof(PType)]
[XmlElement("s", typeof(SType)]
[XmlElement("a", typeof(AType)]
[XmlElement("u", typeof(UType)]
public BaseType Item;
public int Length;
}
public sealed class UType : BaseType
{
[XmlElement("t", typeof(TType)]
[XmlElement("p", typeof(PType)]
[XmlElement("s", typeof(SType)]
[XmlElement("a", typeof(AType)]
[XmlElement("u", typeof(UType)]
public BaseType [] Alts;
public string [] AltNames;
}
最後に、それらすべてを保持して にフィードするコンテナXmlSerializer
:
[XmlRoot("items")]
public class ItemCollection
{
[XmlElement("t", typeof(TType)]
[XmlElement("p", typeof(PType)]
[XmlElement("s", typeof(SType)]
[XmlElement("a", typeof(AType)]
[XmlElement("u", typeof(UType)]
public BaseType [] Items;
}
ご覧のとおり、私のコードにはかなりの繰り返しがあります。ある時点で、新しい派生クラスが導入される可能性があり、BaseType への参照が使用されているすべての場所に、新しいXmlElement
属性を使用して再度アクセスする必要があります。これは退屈で、エラーが発生しやすいです。BaseType
aは、要素名が「t」の場合は TType として、要素名が「p」の場合は PType として、1 回だけデシリアライズできるという事実を表現したいと思います。
私は知っていますが、「ゴールド所有者」が満足していない属性をXmlIncludeAttribute
導入しています. xsi:type
XML 要素名と CLR 型の間のマッピングの知識を除外する方法はありますか?
ソリューションが行うことができる 1 つの仮定は、派生クラスの完全なセットが、 を定義するアセンブリによって認識されているということBaseType
です。つまり、新しいクラスをミックスに追加する外部アセンブリを考慮する必要はありません。