雖然我意識到有類似的問題(How to serialize an Exception object in C#?),雖然該頁面上的答案是有幫助的,但它們並沒有完全解決問題或回答提出的問題。序列化異常是可拋出的
我相信問題是如何序列化對象以允許它被重建(反序列化)成同一個對象。我試圖使用davogones和Antony Booth給出的解決方案,但是在消費方沒有添加System.Exception
基類(如:SerializationException: Exception
),不可能將這些類型(本身)用作實際的異常對象,這些異常對象可以是拋出。
在我繼續之前,讓我解釋一下最後的說法。我試圖在Web服務中使用Antony Booth's solution(該服務包含可序列化對象的定義),試圖讓所有使用者使用相同的異常(希望創建可重用的可序列化的異常類型,而不是重新創建它)。
不幸的是,因爲這兩種類型都不明確從System.Exception
派生,所以他們不能throw
他們,這顯然是有用的。就像我上面提到的那樣,似乎在消費端添加: Exception
到類型定義允許拋出對象,但是這需要編輯自動生成的WSDL/Web服務代碼,這看起來直觀地像是壞/不可維護練習給我(糾正我,如果我錯了)。
我的第一個問題是,是否有可能序列化System.Exception
或創建一個可以序列化的派生類型,如果可能的話,會怎麼做呢?我應該提一下,我已經看過reconstitute the Exception
object的官方方式,但恐怕我不太瞭解它。
我的第二個問題是關於System.Exception
本身的體系結構。我想知道的是,爲什麼System.Exception
類型被標記爲[Serializable]
,因爲它已被記錄並顯然被設計爲不允許您正確序列化(至少使用XML),因爲它的對象實現IDictionary
對象實現了Data
?
問:爲什麼我不能序列化哈希表?
答:XmlSerializer無法處理實現IDictionary接口的類。部分原因是由於進度約束,部分原因是哈希表在XSD類型系統中沒有對應項。唯一的解決方案是實現一個不實現IDictionary接口的自定義哈希表。
由於XML正在成爲(如果不是已經是)進行數據傳輸(由微軟,但是官方推薦)的新標準,它似乎荒謬愚蠢的,不允許在.NET中的唯一對象類型,可以是拋出不是XML可序列化的。
我期待聽到來自所有SO'rs的一些想法(特別是因爲這是我的第一篇文章)。
如果您有任何問題或需要澄清,請不要猶豫,讓我知道。
注:我剛剛發現this SO post,這似乎回答幾個問題,但我想我願意把我自己捶它。儘管如此,讓我知道它是否太接近重複。
只是一個簡短的提示'ApplicationException'已被棄用,應該_not_被使用或子類。改用'Exception'。 – thecoop 2010-08-31 13:44:34
不幸的是,這似乎不適用於Web服務的上下文中。我複製了你的代碼,並將'ApplicationException'改爲'Exception',並且得到了我之前提到的相同的錯誤代碼: 無法序列化System.Collections.IDictionary類型的成員System.Exception.Data,因爲它實現IDictionary的。 只需添加'[Serializable]'是不夠的。 – llaughlin 2010-08-31 14:16:31
Hrm。也許你可以將_data成員更改爲不能實現IDictionary的可序列化集合?這裏有一些實現。 – 2010-09-01 07:04:29