2009-06-30 12 views
33

Nawiązując do What is the correct way to make a custom .NET Exception serializable?
i Are all .NET Exceptions serializable? ...Dlaczego zawsze powinienem zrobić wyjątek [możliwy do serializacji]? (NET)

Dlaczego moje wyjątki być serializacji?
Ktoś powiedział "może to być uznane za błąd", jeśli niestandardowy wyjątek zdefiniowany przez bibliotekę strony trzeciej nie podlega przekształceniu do postaci szeregowej. Czemu?

Dlaczego wyjątki różnią się od innych klas w tym zakresie?

Odpowiedz

48

Ponieważ Twoje wyjątki mogą wymagać wymiany między różnymi domenami aplikacji, a jeśli nie są (prawidłowo) serializowane, utracisz cenne informacje dotyczące debugowania. W przeciwieństwie do innych klas, nie będziesz mieć kontroli nad tym, czy twój wyjątek zostanie zebrany - to zrobi.


Kiedy mam na myśli „nie będzie mieć kontrolę” To znaczy, że klasy tworzone zazwyczaj mają ograniczoną przestrzeń istnienie i istnienie jest dobrze znana. Jeśli jest to wartość zwracana i ktoś próbuje wywołać ją w innej AppDomain (lub na innej maszynie), otrzyma błąd i może po prostu powiedzieć "Nie używaj tego w ten sposób". Wywołujący wie, że musi przekonwertować go na typ, który może być serializowany (przez zawijanie wywołania metody). Jednak ponieważ wyjątki są przepuszczane na szczyt, jeśli nie zostaną przechwycone, mogą przekroczyć granice AppDomain, o których nawet nie wiedziałeś. Twój niestandardowy wyjątek aplikacji 20 poziomów w innym AppDomain może być wyjątkiem zgłaszanym w Main() i nic po drodze nie przekształci go w wyjątek serializowalny dla ciebie.

+0

To naprawdę dobra odpowiedź. – Cheeso

+2

Czy możesz wymyślić konkretną sytuację/przykład, w którym to może faktycznie nastąpić? – Sam

0

Oprócz odpowiedzi Talljoe za twoje wyjątki mogą być przekazywane w poprzek Web Services, a także, w tym przypadku wyjątek musi być możliwy do serializacji/deserializable więc może być przekształcony XML i przesyłane przez serwis WWW

+3

Jeffrey: jesteś prawie poprawny. Kiedy wyjątek jest "wysyłany" przez usługę sieciową, nie wszystkie muszą być serializowane. W rzeczywistości jest to przekształcane w błąd SOAP, więc pełna wierność nie jest wymagana. Ponadto, Serializator XML używany w starych usługach ASMX nie zwraca żadnej uwagi na [Serializable]. –

0

I domyślne dla wszystkich klas powinno być nadające się do serializacji, chyba że zawierają one klasę, która nie jest jawnie przekształcana do postaci szeregowej. To denerwujące, że nie można przenieść klasy tylko dlatego, że jakiś projektant nie pomyślał o tym.

To samo z "Końcowym", wszystkie zmienne powinny być domyślnie "Ostateczne", chyba że wyraźnie powiesz, że są "Mutowalne".

Ponadto, nie jestem pewien, czy ma sens mieć zmienną, która nie jest prywatna.

No cóż, trzeba zaprojektować własny język.

Ale odpowiedź brzmi, nie wiesz, w jaki sposób twój wyjątek zostanie wykorzystany i zakłada się, że można go rzucać przez połączenia zdalne.

+1

@Bill: Alternatywnie, projektant _did_ myśli o tym, ale zdecydował się nie wspierać serializacji.Na przykład, w jaki sposób można użyć serializacji klasy, która przechowuje uchwyty do zasobów natywnych lub nawet po prostu otwiera strumienie? –

+0

Wyjątki nie powinny tego robić. Poza tym 3 klasy, na które napotkałem i chciałem serializować w ostatnim miesiącu (w tym wyjątek), nie miały takich ograniczeń. Po prostu nie zostało to sprecyzowane przez komitet, który zaprojektował niezmienny API –

+1

Och, a jeśli chodzi o moją domyślną sugestię serializowalną, gdybyś miał te warunki, zasoby byłyby oznaczone jako "niemożliwe do podrobienia", które byłyby połączone z twoją klasą czyniąc go niemożliwym do podrobienia, chyba że oznaczyłeś je jako "przejściowe", więc działałoby dobrze - lepiej niż obecny system. –

-1

Kolejnym miejscem, w którym obiekty wymagające serializacji są sesje Asp.Net. Przechowujemy ostatni wyjątek w sesji, a nie w postaci szeregowalnej wyjątki wymagają dodatkowego tłumaczenia, aby przechowywać ich dane w postaci szeregowej (określając oryginalny wyjątek jako wewnętrzny, nie pomaga).

+0

To brzmi jak powód, dla którego wyjątki muszą być zsynchronizowane w * twoim * przypadku użycia, ale tak naprawdę nie odpowiada na ogólne pytanie. – stakx

+0

@stakx, jeśli masz prawo do kodu, powinieneś rozważyć różne przypadki użycia, gdzie można go użyć –