虽然我意识到有类似的问题(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