2012-07-04 81 views
8

我從各種異常派生了幾個類。現在VS給出了這個問題標題中的警告。派生自異常類警告:CA2237:用SerializableAttribute標記ISerializable類型

1.有人能解釋一下抑制這條規則的含義嗎?

2.您能解釋一下here的規則:「不要在異常類中禁止此規則的警告,因爲它們必須是可序列化的才能在應用程序域中正常工作。」?

謝謝。

P.S.那麼我自己有一個答案。您確實必須將異常標記爲可序列化。它們在同一個AppDomain中沒有這個屬性就可以正常工作。但是,如果您嘗試從其他域中捕獲它,則必須進行序列化才能跨越應用程序邊界。這是我找到的主要原因。

回答

12

這不完全是Visual Studio警告,它是由FxCop工具生成的警告。您可以從VS分析菜單運行。 FxCop是一個靜態分析器,它在.NET程序中尋找常見的陷阱,編譯器不會標記。它的大部分警告都很模糊,並且很少是真正嚴重的問題,你需要把它看作是「你有沒有想過這個?」一種工具。

這裏試圖提醒你的小實例是Exception類實現了ISerializable並具有[Serializable]屬性。這是一個非常困難的要求,它使基礎的Exception對象在各個應用程序域之間可序列化。必要的,因爲Exception不會從MarshalByRefObject派生。並且必須允許您在另一個應用程序域中運行的代碼拋出您可以捕獲的異常。

所以FxCop注意到你沒有對你自己的Exception派生類做同樣的事情。如果您打算讓引發異常的代碼在另一個應用程序域中運行,那麼這只是一個問題。 FxCop不夠聰明,不知道你是否這樣做,它只能提醒你,當你這樣做的時候出問題。這是非常罕見的,所以當你不知道你是否願意或者對你而言聽起來像是中國人時,可以隨意忽略警告。

+0

在做了一些閱讀和玩AppDomain邊界之後,.NET確實開始給它自己的例外說這些類沒有[Serializable]。關於appDomain.CreateInstance(...,classNameForThisDomain,...)的一個有趣的觀點是,它創建並在應用程序域中運行classNameForThisDomain,與我們僅在此類從MarshalByRefObject派生時執行的應用程序域不同。但是如果沒有,classNameForThisDomain會被加載到同一個AppDomain中! – Nickolodeon

0

如果你不打算在你的應用程序中使用多個AppDomain,我認爲你可以忽略它或壓制。

+0

是不是每個程序都使用AppDomains?從[System.AppDomain的MSDN文檔](https://msdn.microsoft.com/en-us/library/system.appdomain.aspx):*「AppDomain實例用於加載和執行程序集。AppDomain類實現一組事件,使應用程序在加載程序集時能夠響應「*。聽起來像加載程序集的任何應用程序都使用AppDomain。由於每個程序都可能加載'System.dll',因此MSDN文檔將暗示所有內容都使用應用程序域。 –

+0

@IanBoyd:我認爲我的觀點是使用多個應用程序域,即創建自己的域。 – abatishchev

相關問題