2009-06-30 15 views
33

riferimento alla What is the correct way to make a custom .NET Exception serializable?
e Are all .NET Exceptions serializable? ...Perché dovrei sempre rendere le mie eccezioni [serializzabili]? (NET)

Perché le mie eccezioni essere serializzabile?
Qualcuno ha detto "può essere considerato un bug" se un'eccezione personalizzata definita da una libreria di terze parti non è serializzabile. Perché?

Perché le eccezioni sono diverse rispetto ad altre classi in questo senso?

risposta

48

Poiché le eccezioni possono richiedere il marshalling tra diversi AppDomain e se non sono serializzabili (correttamente) si perderanno preziose informazioni di debug. A differenza delle altre classi, non avrai il controllo sul fatto che la tua eccezione verrà scartata - lo farà.


Quando dico "non si avrà il controllo" Voglio dire che le classi create in genere hanno uno spazio finito della esistenza e l'esistenza è ben nota. Se si tratta di un valore di ritorno e qualcuno tenta di chiamare in un altro AppDomain (o su una macchina diversa) che riceveranno un guasto e può solo dire "Non usare in questo modo." Il chiamante sa che devono convertirlo in un tipo che può essere serializzato (avvolgendo la chiamata al metodo). Tuttavia dal momento che le eccezioni sono ribollite fino in cima se non catturate possono superare i confini di AppDomain che non sapevi nemmeno di avere. L'eccezione dell'applicazione personalizzata di 20 livelli in profondità in un diverso AppDomain potrebbe essere l'eccezione riportata in Main() e nulla lungo la strada lo convertirà in un'eccezione serializzabile per te.

+0

Questa è davvero una buona risposta. – Cheeso

+2

Riesci a pensare ad una situazione/esempio specifico in cui ciò potrebbe effettivamente accadere? – Sam

0

Oltre alla risposta di Talljoe, le vostre eccezioni possono essere passati attraverso i servizi Web e, in questo caso, l'eccezione deve essere serializzabile/deserializable in modo che possa essere trasformato in XML e trasmesso dal servizio Web

+3

Jeffrey: hai quasi ragione. Quando un'eccezione viene "inviata" su un servizio web, non tutto viene necessariamente serializzato. In realtà viene convertito in un errore SOAP, quindi non è richiesta la massima fedeltà. Inoltre, il Serializzatore XML utilizzato nei vecchi servizi ASMX presta poca o nessuna attenzione al [Serializable]. –

0

I pensa che l'impostazione predefinita per tutte le classi debba essere serializzabile a meno che non contenga una classe esplicitamente non serializzabile. È fastidioso non essere in grado di trasferire una classe solo perché alcuni designer non ci hanno pensato.

la stessa cosa con "Final", tutte le variabili devono essere "finale" per impostazione predefinita a meno che non specificatamente dire che sono "Mutevole".

Inoltre, non sono sicuro che abbia senso avere una variabile che non è privata.

Oh beh, ho bisogno di progettare la mia lingua.

Ma la risposta è che non so come verrà utilizzato il tuo eccezione e si presume essere in grado di essere gettato attraverso chiamate remote.

+1

@Bill: In alternativa, il designer _did_ ci pensa, ma decide di non supportare la serializzazione.Ad esempio, come utilizzare la serializzazione di una classe che contiene handle per risorse native o anche solo per aprire stream? –

+0

Le eccezioni non dovrebbero essere necessarie. Inoltre, le 3 classi che ho incontrato e che volevo serializzare nell'ultimo mese (inclusa un'eccezione) non avevano restrizioni di questo tipo. Semplicemente non è stato specificato in quel modo dal comitato che ha progettato l'API immodificabile –

+1

Oh, e come per il mio serializzabile per suggerimento predefinito, se avessi quelle condizioni, le risorse sarebbero contrassegnate come "non serializzabili" che sarebbero collegate alla tua classe rendendolo non graduabile a meno che non li abbia taggati come "transitori", quindi funzionerebbe benissimo, meglio del sistema attuale. –

-1

Un altro punto in cui gli oggetti devono essere serializzabili è Asp.Net Session. Memorizziamo l'ultima eccezione in Session e le eccezioni non serializzabili richiedono una traduzione extra per memorizzare i loro dettagli come serializzabili (specificando l'eccezione originale come inner non aiuta)

+0

Questo sembra un motivo per cui le eccezioni devono essere sdializzate nel * caso d'uso *, ma in realtà non risponde alla domanda generale. – stakx

+0

@stakx, quando hai ragione il codice, dovresti considerare diversi casi d'uso, dove può essere usato –

Problemi correlati