Ответ на What is the correct way to make exceptions serializable? говорит, что «правильная» базовая реализация для пользовательского исключения включает в себя 4 ctors:re: дизайн пользовательских исключений: должен ли я реализовать конструктор по умолчанию? конструктор «внутреннего исключения»?
[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. Но, кроме того,
Для целей бинарной сериализации, что и С.О. вопрос имел в виду, я должен реализовать все 4 конструкторами? Я думаю, для целей [Serializable] я должен предоставить ctor, который принимает 2 аргумента типа (SerializationInfo, StreamingContext), потому что исключение происходит из System.Exception, которое само выполняет сериализацию. Я могу понять, что. Но должен ли я использовать другие ctors, , чтобы правильно обеспечить сериализуемое исключение? Я знаю, что если я хочу, чтобы тип был xml-сериализуемым, мне нужно предоставить стандартный (no-op) ctor. То же самое верно для [Serializable]? На мгновение остановимся на узкой заботе о [Serializable] и оставим в стороне все более широкие рекомендации относительно «каркасного дизайна».
Переход к более широкому вопросу: The guidelines say что пользовательские исключения должны выполнять 4 общих ctors. Каковы причины этого руководства? Если я создаю настраиваемое исключение, действительно ли это плохие манеры или даже ошибка, если я не предоставляю null/default ctor? Это действительно плохие манеры или даже ошибка, если я не предоставляю ctor, который допускает внутреннее исключение? Зачем? Рассмотрим случай, когда мое настраиваемое исключение создается в моем коде библиотеки, и единственные экземпляры, которые я когда-либо бросал, включают сообщение и отсутствие внутреннего исключения.
Короче говоря, является ли следующий код приемлемым для пользовательского исключения, которое не предоставляет дополнительных свойств?
[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) { }
}
Смотри также: Winterdom blog: Make exceptions Serializable.
Впервые я вижу, что кто-то использует «ctor» для обозначения конструктора O_o. К счастью для меня, вы использовали полное слово один раз, чтобы я мог понять название. Я предлагаю вам изменить свой заголовок ... – Ksempac