我有一個層次結構類,我想使用XmlSerializer
類及其相關屬性進行序列化。有一個基本的抽象類,然後有很多派生類(在我的代碼中,我已經將派生類的數量減少到五個,但實際代碼中有更多)。這些類形成一個層次結構,並且經常包含對層次結構中類的實例的引用。如何序列化其類相互引用的類層次結構,但避免使用XmlInclude?
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
屬性重新訪問。這是乏味的,也是容易出錯的。我想表達一個事實,即如果元素名稱爲「t」,則可以將BaseType
作爲TType反序列化,但如果元素名稱爲「p」等,則只能將其作爲PType反序列化一次。
我知道XmlIncludeAttribute
,但它引入了「金主」不滿意的xsi:type
屬性。有什麼辦法可以將XML元素名稱和CLR類型之間的映射知識分解出來嗎?
一個假設的溶液可以使是全套派生類的由限定BaseType
組件是已知的。這意味着我們不必考慮外部程序集將新類添加到組合中。