我有一個實現通用接口的對象列表。如果我嘗試簡單的序列化它,我得到一個不錯的異常告訴我,該串行不能序列接口:XmlSerializer錯誤序列化接口對象
private readonly ObservableCollection<ICanHasInterface> children = new ObservableCollection<ICanHasInterface>();
public ObservableCollection<ICanHasInterface> Children
{
get { return children; }
}
=>「無法序列成員...類型的...因爲它是一個接口」
顯然要求序列化程序獲取對象的類型並用屬性xsi:type
(如果對象從另一個類繼承)標記XmlElement太多。
,因爲我不想要實現IXmlSerializable
,我想出了一個解決辦法,其看起來最初有爲:
private readonly ObservableCollection<ICanHasInterface> children = new ObservableCollection<ICanHasInterface>();
[XmlIgnore()]
public ObservableCollection<ICanHasInterface> Children
{
get { return children; }
}
[XmlElement("Child")]
public List<object> ChildrenSerialized
{
get
{
return new List<object>(Children);
}
set
{
Children.Clear();
foreach (var child in value)
{
if (child is ICanHasInterface) AddChild(child as ICanHasInterface);
}
}
}
有了這個至少系列化工作得很好(注:請指定XmlInclude
屬性的類型,可以在原始列表中或在串行器的構造函數中交出類型數組),但是如果對象被反序列化,則Children
集合會變空,因爲set
塊在反序列化期間永遠不會到達,所以我對於爲什麼會這樣是;有任何想法嗎?
非常感謝,與陣列完美配合! – 2011-01-10 21:06:06