Почему я должен всегда делать исключения [serializable]? (.ЧИСТЫЙ)
со ссылкой на Как правильно сделать пользовательское исключение .NET сериализуемым?
и все исключения .NET сериализуемы? ...
почему мои исключения должны быть сериализуемыми?
Кто-то сказал: "Это можно считать ошибкой", если пользовательское исключение, определенное сторонней библиотекой, не сериализуемо. Почему?
Почему исключения отличаются от других классов в этом отношении?
4 ответов
потому что ваши исключения могут потребоваться маршалировать между различными AppDomains, и если они не (правильно) сериализуемы, вы потеряете драгоценную отладочную информацию. В отличие от других классов, у вас не будет контроля над тем, будет ли ваше исключение маршалироваться-оно будет.
когда я имею в виду" у вас не будет контроля", я имею в виду, что классы, которые вы создаете, обычно имеют конечное пространство существования, и существование хорошо известно. Если это возвращаемое значение, и кто-то пытается вызовите его в другом AppDomain (или на другой машине), они получат ошибку и могут просто сказать: "Не используйте его таким образом."Абонент знает, что они должны преобразовать его в тип, который может быть сериализован (оборачивание вызова метода). Однако, поскольку исключения пузырятся до самого верха, если они не пойманы, они могут выходить за границы AppDomain, о которых вы даже не знали. Ваше пользовательское исключение приложения 20 уровней глубоко в другом AppDomain может быть исключением, о котором сообщается в Main () и ничто на этом пути не превратит его в сериализуемое исключение для вас.
в дополнение к ответу Talljoe ваши исключения также могут передаваться через веб-службы, в этом случае исключение должно быть сериализуемым/десериализуемым, чтобы оно могло быть превращено в XML и передано веб-службой
Я думаю, что значение по умолчанию для всех классов должно быть Сериализуемым, если они не содержат класс, который явно не сериализуем. Это раздражает, что нельзя перенести класс только потому, что какой-то дизайнер не подумал об этом.
то же самое с "Final", все переменные должны быть "Final" по умолчанию, если вы специально не скажете, что они "изменчивы".
кроме того, я не уверен, что имеет смысл иметь переменную, которая не является частной.
другое место, где объекты должны быть сериализуемыми Asp.Net сеанс. Мы храним последнее исключение в сеансе, а не сериализуемые исключения нуждаются в дополнительном переводе, чтобы сохранить их данные как сериализуемые (указание исходного исключения как внутреннего не помогает)