2009-06-30 14 views

Respuesta

48

Debido a que sus excepciones pueden necesitar ser ordenadas entre diferentes AppDomains y si no son (correctamente) serializables perderá información de depuración preciosa. A diferencia de otras clases, no tendrá control sobre si su excepción se organizará, lo hará.


Cuando me refiero a "no tendrá el control" quiero decir que las clases se crean generalmente tienen un espacio finito de la existencia y la existencia es bien conocida. Si se trata de un valor de retorno y alguien intenta llamarlo en un Dominio de aplicación diferente (o en una máquina diferente) obtendrá un error y puede decir "No lo use de esa manera". La persona que llama sabe que tienen que convertirlo en un tipo que se puede serializar (envolviendo la llamada al método). Sin embargo, dado que las excepciones se borran hasta la parte superior si no se capturan, pueden trascender los límites de AppDomain que ni siquiera sabías que tenías. Su excepción de aplicación personalizada de 20 niveles de profundidad en un AppDomain diferente podría ser la excepción reportada en Main() y nada en el camino la convertirá en una excepción serializable para usted.

+0

Esa es una muy buena respuesta. – Cheeso

+2

¿Puedes pensar en una situación/ejemplo específico en el que esto realmente podría suceder? – Sam

0

Además de la respuesta de Talljoe, sus excepciones pueden pasar a través de servicios web, así, en este caso la excepción debe ser serializable/deserializable por lo que se puede convertir en XML y transmitido por el Servicio Web

+3

Jeffrey: estás casi en lo correcto. Cuando se "envía" una excepción a través de un servicio web, no necesariamente se está serializando necesariamente. En realidad se está convirtiendo en una falla SOAP, por lo que no se requiere fidelidad completa. Además, el Serializador XML utilizado en los antiguos servicios ASMX presta poca o ninguna atención a [Serializable]. –

0

I piense que el valor predeterminado para todas las clases debería ser Serializable a menos que contenga una clase que no sea explícitamente serializable. Es molesto no poder transferir una clase solo porque algún diseñador no lo pensó.

Lo mismo con "Final", todas las variables deben ser "Finales" por defecto a menos que específicamente diga que son "Mutable".

Además, no estoy seguro de que tenga sentido tener una variable que no sea privada.

Bueno, necesito diseñar mi propio idioma.

Pero la respuesta es que no sabe cómo se usará su excepción y se supone que pueden lanzarse a través de llamadas remotas.

+1

@Bill: Alternativamente, el diseñador _did_ piensa en ello, pero decidió no apoyar la serialización.Por ejemplo, ¿cómo usaría serializar una clase que contenga identificadores a recursos nativos, o incluso simplemente abrir streams? –

+0

Las excepciones no deberían necesitar hacer eso. Además, las 3 clases con las que me topé y quería serializar el último mes (incluida una excepción) no tenían tales restricciones. Simplemente no fue especificado de esa manera por el comité que diseñó la inmutable API –

+1

Ah, y en cuanto a mi sugerencia serializable por defecto, si tuviera esas condiciones, los recursos se marcarían como "no serializables" que encadenarían a su clase por lo que es deserializable, a menos que los etiquetes como "transitorios", por lo que funcionaría bien, mejor que el sistema actual. –

-1

Otro lugar donde los objetos deben ser serializables es Asp.Net Session. Almacenamos la última excepción en la sesión y las excepciones no serializables necesitan una traducción adicional para almacenar sus detalles como serializables (especificando la excepción original como interno no ayuda)

+0

Esto suena como una razón por la cual las excepciones deben ser identificables en * su * caso de uso, pero realmente no responde a la pregunta general. – stakx

+0

@stakx, cuando aciertes el código, debes considerar diferentes casos de uso, donde se puede usar –

Cuestiones relacionadas