2010-03-08 25 views
9

我有一個Bar類,它包含一個List<Foo>FooBar都實現了ISerializable。反序列化包含列表的類<T>:爲什麼List最初填充了空值?

當反序列化Bar時,List<Foo>最初被填充(正確數量)null s;然後在退出Bar反序列化的過程中,調用每個Foo的反序列化命令,用(正確反序列化的)Foo填充List<Foo>

這是怎麼發生的?我無法在一個測試項目中複製它:無論我嘗試過什麼,導致Foo反序列化過程在之前被稱爲Bar ctor。這實際上是我想要的行爲,因爲我需要填充列表以便爲反序列化的Bar進行一些初始化!

任何人都有一個想法,以至於可能導致Foo這麼晚才被反序列化?謝謝!

+2

順便說一下,我已經能夠在反序列化之後但在返回之前使用[OnDeserializedAttribute]的方法進行所需的初始化(請參閱http://msdn.microsoft.com/zh-cn/library/system.runtime。 serialization.ondeserializedattribute%28v = VS.90%29.aspx)。 – 2010-03-08 12:44:26

+1

參見http://stackoverflow.com/questions/1097797/custom-net-serialization-doesnt-seem-to-work;儘管沒有更好的答案。 – 2010-03-08 13:41:51

回答

5

這是邏輯。反序列化器按對象對它進行反序列化,然後依次引用。所以,首先它用X空格設置列表......實際上它們都是NULL。

然後它進入並反序列化對象,將它們放入適當的引用中。

所有檢查等邏輯從你應該只運行後反序列化已完成 - 根據定義,你必須始終有部分/無效狀態,而解串器運行。

問題出現的原因爲時已晚,您的測試場景比真實數據要容易得多,所以有些東西使得序列化程序在生產端「轉向訂單」。

+0

這對我來說沒有意義。序列化程序一次只檢查一個對象,在這種情況下,測試用例的行爲也會像Bar一樣,或者它正在查看對象圖並從底部開始,在這種情況下,Bar應以不同的方式工作。 – 2010-03-08 11:36:43

+1

在任何情況下,它都不會達到我期望的效果,這是以Bar開頭的;那麼當它到達Foos列表時,反序列化每個Foo;然後繼續與酒吧。 – 2010-03-08 11:38:24

相關問題