2010-03-24 58 views
1

我有各種複雜的對象,往往有其他複雜的對象的集合。有時我只想在需要時加載集合,所以我需要一種方法來跟蹤集合是否已加載(null/empty並不一定意味着它尚未加載)。爲此,這些複雜的對象繼承自維護已加載集合集合的類。然後,我們只需要一個電話在二傳手添加到功能,我們要進行跟蹤,像這樣每個集合:XmlSerializer和OnSerializing/OnSerialized替代

public List<ObjectA> ObjectAList { 
    get { return _objectAList; } 
    set { 
     _objectAList = value; 
     PropertyLoaded("ObjectAList"); 
    } 
} 

的PropertyLoaded功能更新的集合,跟蹤哪些藏品都被載入。

不幸的是,這些對象在Web服務中被使用,因此被(序列化)和所有設置器被調用,並且PropertyLoaded在實際上沒有被調用時被調用。

理想情況下,我希望能夠使用OnSerializing/OnSerialized,以便函數知道它是否被合法調用,但是我們使用XmlSerializer,因此這不起作用。儘管我想更改爲使用DataContractSerializer,但出於各種原因,目前我無法做到這一點。

是否有其他方式知道序列化是否發生?如果沒有,或者是否有更好的方法來達到上述目的,而無需每次需要跟蹤新集合時都要額外編寫代碼?

回答

3

XmlSerializer不支持序列化回調。不過,你有一些選擇。例如,如果你想選擇是否連載名爲ObjectAList屬性,你可以添加一個方法:

public bool ShouldSerializeObjectAList() { /* logic */ } 

如果需要反序列化過程中知道太多,你可以使用:

[XmlIgnore] 
public bool ObjectAListSpecified { 
    get { /* logic whether to include it in serialization */ } 
    set { /* logic to apply during deserialization */ } 
} 

(雖然你可能會發現 - 我不能肯定 - 即set只呼籲true情況下)

另一種選擇,當然,是落實IXmlSerializable,但只應作爲一拉st度假村。這並不好玩。