2012-12-01 43 views
3

我有一個標記爲Serializable的基類,以及標記爲Serializable的派生類。我想在反序列化過程中在基類中做一些事情,因此聲明瞭一個標記爲OnDeserializing的方法,但重要的是此方法將在任何派生類的OnDeserializing方法之前執行。
派生類也可能由其他人編寫。
我可以相信基類的方法將在派生類中的任何序列化方法之前被調用嗎?
我會用SoapFormatter繼承樹上的反序列化命令

+0

我正在使用IFormatter。由於某些原因,無法使用Serializer(如XmlSerializer)。 – RoadBump

+0

另一個有用的問題[這裏](http://stackoverflow.com/questions/4023644/can-ondeserializedattribute-be-used-instead-of-ideserializationcallback-interfac)。從我的測試中,順序是「Base.OnDeserializing」,「Derived.OnDeserializing」,「Base.OnDeserialized」,「Derived.OnDeserialized」,但它可能取決於對象圖的確切結構。 – RoadBump

回答

2

我打算出去走一走,說它可能會首先找到派生的方法,而不是基於我所見過的將反射用於其他目的的基礎方法。我建議你可能希望顯式調用孩子的基本行爲,而不是依賴任何用屬性標記的方法的順序。如果較低級別的對象是可直接實例化的,而不是抽象的,因此可能還有一個OnDeserializing-marked方法,您可能需要設置標誌來指示是否已經處理了該級別。

+0

忘了寫,但派生類可能是由其他人創建的,所以我無法控制它。無論如何,謝謝你的重要信息。這非常有幫助。 – RoadBump

+0

@RoadBump你可能想要考慮使用一個可以被重寫的方法 - 這樣你就可以控制繼承類如何完成,包括首先顯式調用基類代碼。 – tvanfosson

+0

聽起來像個好主意。我想實現'ISerializable'接口需要一個特殊的構造函數,請參見[這裏](http://www.diranieh.com/netserialization/binaryserialization.htm#Custom%20Serialization)。使用構造函數是否確保在派生類的序列化之前調用基類的ctor? – RoadBump