【发布时间】:2010-11-07 06:35:33
【问题描述】:
What is the correct way to make exceptions serializable? 的答案说自定义异常的“正确”基本实现包括 4 个 ctor:
[Serializable]
public class SerializableExceptionWithoutCustomProperties : Exception
{
public SerializableExceptionWithoutCustomProperties()
{
}
public SerializableExceptionWithoutCustomProperties(string message)
: base(message)
{
}
public SerializableExceptionWithoutCustomProperties(string message, Exception innerException)
: base(message, innerException)
{
}
// Without this constructor, deserialization will fail
protected SerializableExceptionWithoutCustomProperties(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
}
马上,我会说这对于 Exception 类型来说是一个非常糟糕的名字。但是,除此之外,
为了二进制序列化,这就是 SO 问题所指的,我必须实现所有 4 个构造函数吗?我认为出于 [Serializable] 的目的,我必须提供一个接受 2 个类型参数(SerializationInfo、StreamingContext)的 ctor,因为异常源自 System.Exception,它本身进行自定义序列化。我可以理解。但是我必须实现其他 ctor,以便正确提供可序列化的异常吗?我知道,如果我想允许一个类型可 xml 序列化,我需要提供默认(无操作)ctor。 [Serializable] 也一样吗?暂时,让我们将自己局限在 [Serializable] 的狭隘关注点上,而将有关“框架设计”的任何更广泛的准则放在一边。
转向更广泛的问题:The guidelines say自定义异常应该实现 4 个公共 ctor。该指南背后的原因是什么?如果我设计了一个自定义异常,如果我不提供 null/default ctor,这真的是不礼貌,甚至是错误吗?如果我不提供允许 innerException 的 ctor,这真的是不礼貌,甚至是错误吗?为什么?考虑一下我的自定义异常是在我的库代码中生成的,我曾经抛出的唯一实例包括一条消息,而没有 innerException。
简而言之,对于不提供其他属性的自定义异常,以下代码是否可以接受?
[Serializable]
public class CustomException : Exception
{
public CustomException(string message) : base(message) { }
// Without this constructor, deserialization will fail
protected CustomException(SerializationInfo info, StreamingContext context)
: base(info, context) { }
}
【问题讨论】:
-
我第一次看到有人使用“ctor”来表示构造函数 O_o。对我来说幸运的是,您确实使用了完整的单词一次,所以我可以理解标题。我建议你改变你的标题...
标签: .net exception class-design serializable