Почему мне всегда следует делать свои исключения [сериализуемыми]?(.СЕТЬ)

StackOverflow https://stackoverflow.com/questions/1066701

  •  21-08-2019
  •  | 
  •  

Вопрос

Ссылаясь на Как правильно сделать сериализуемое пользовательское исключение .NET?
и Все ли исключения .NET сериализуемы? ...

Почему мои исключения должны быть сериализуемыми?
Кто-то сказал, что «это можно считать ошибкой», если пользовательское исключение, определенное сторонней библиотекой, не подлежит сериализации.Почему?

Почему в этом отношении исключения отличаются от других классов?

Это было полезно?

Решение

Поскольку ваши исключения, возможно, придется распределять между разными доменами приложений, и если они не будут (должным образом) сериализоваться, вы потеряете ценную информацию об отладке.В отличие от других классов, вы не сможете контролировать, будет ли маршалироваться ваше исключение — оно будет.


Когда я имею в виду «у вас не будет контроля», я имею в виду, что создаваемые вами классы обычно имеют конечное пространство существования, и это существование хорошо известно.Если это возвратное значение, и кто -то пытается вызвать его в другом приложении (или на другой машине), он получит ошибку и может просто сказать «не используйте его таким образом». Вызывающий абонент знает, что он должен преобразовать его в тип, который может быть сериализован (путем обертывания вызова метода).Однако, поскольку исключения всплывают на самый верх, если их не перехватить, они могут выйти за границы AppDomain, о которых вы даже не подозревали.Исключение вашего пользовательского приложения на глубине 20 уровней в другом AppDomain может быть исключением, о котором сообщает Main(), и ничто на этом пути не преобразует его в сериализуемое исключение для вас.

Другие советы

В дополнение к ответу Талджо ваши исключения также могут передаваться через веб-службы, в этом случае исключение должно быть сериализуемым/десериализуемым, чтобы его можно было преобразовать в XML и передать веб-службой.

Я думаю, что по умолчанию для всех классов должен быть сериализуемый, если только они не содержат класс, который явно не сериализуем.Раздражает невозможность перенести класс только потому, что какой-то дизайнер об этом не подумал.

То же самое и с «Final», все переменные должны быть «Final» по умолчанию, если вы специально не укажете, что они «Mutable».

Кроме того, я не уверен, что имеет смысл иметь переменную, которая не является частной.

Ну что ж, нужно создать свой собственный язык.

Но ответ в том, что вы не знаете, как будет использоваться ваше исключение, и предполагается, что они могут быть выброшены при удаленных вызовах.

Еще одно место, где объекты должны быть сериализуемыми, — это сеанс Asp.Net.Мы храним последнее исключение в сеансе, а не сериализуемые исключения требуют дополнительного перевода, чтобы сохранить их данные как сериализуемые (указание исходного исключения как внутреннего не помогает)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top