我正在爲我正在使用的系統集合編寫一個不可知的查看器。這個查看器將顯示我的數據的通用結構,而不需要知道特定系統的上下文。在反序列化時丟失引用時不會引發異常
我試圖反序列化僅包含一個類型的內存流Foo<T>
其中Foo<T>
繼承自Foo
。從不可知論的觀點來看,我需要的所有數據都在Foo中。 <T>
部分是無關緊要的。
類型T在另一個程序集中定義。在正常操作下,系統顯然已加載所有適當的上下文組件。問題是,在運行查看器時,沒有任何上下文組件被加載。當我嘗試反序列化Foo的實例時,我明顯得到一個異常,因爲引用的程序集未加載。
我試圖檢測我是否加載了所有需要的引用程序集,從而知道是否嘗試對數據進行反序列化,或者重新構建了我需要從該類的其他方面獲得的數據。
我知道我可以使用一個非常簡單的異常try/catch塊來做到這一點,但是,這不是一個例外情況。 I 知道當我加載數據時,這將會發生數百次(如果不是數千次),這可能會導致我變成一場噩夢,因爲我喜歡打破異常。我還訂閱了「異常 - 提示在名稱中」的思想流派,因此異常不應構成您的主要案例代碼的一部分。
--------編輯21/10/2013 ------------
看到here一個完整的說明性的例子,但這裏有重要的位:
Foo類,在共同定義:
[Serializable]
public class Foo
{
public string Agnostic { get; set; }
}
[Serializable]
public class Foo<T> : Foo
{
public string Contextual { get; set; }
}
上下文保存:
BinaryFormatter bf = new BinaryFormatter();
FileInfo tempFile = TempFileGetter.GetTempFile();
Foo<Bar> fooBar = new Foo<Bar>();
fooBar.Agnostic = "Agnostic";
fooBar.Contextual = "Contextual";
using (var fs = tempFile.OpenWrite())
{
bf.Serialize(fs, fooBar);
fs.Flush();
}
不可知論裝載:
BinaryFormatter bf = new BinaryFormatter();
FileInfo tempFile = TempFileGetter.GetTempFile();
using (var fs = tempFile.OpenRead())
{
Foo foo = (Foo)bf.Deserialize(fs);
Controls.DataContext = foo;
}
我的意思是,沒有什麼火箭科學在這段代碼,而且,如果「不可知」瀏覽器加載上下文觀衆作爲參考,那麼它加載罰款,但是,我並不想這樣做,因爲我們不會總是加載上下文庫。
你能舉一個你的反序列化代碼的例子嗎?你能改變序列化代碼嗎? –
添加代碼來說明問題(完整的可下載版本) –