Sind alle .NET Ausnahmen serialisierbar?
Können alle .NET exception-Objekte, die serialisiert werden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können alle .NET exception-Objekte, die serialisiert werden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja und Nein. Als Jeff und andere haben darauf hingewiesen, dass der alle exception-Klassen sollte und fast immer serialisierbar sind. Wenn Sie laufen über eine bestimmte Ausnahme-Klasse, die nicht serialisierbar sind, ist es sehr wahrscheinlich ein bug.
Aber wenn man serialisierbarkeit, die Sie berücksichtigen müssen sowohl die unmittelbaren Klasse und alle Typen, die Mitglieder dieses Typs (dies ist ein rekursiver Prozess). Der Exception-Basisklasse hat eine Daten Eigenschaft, die den Typ IDictionary. Dies ist problematisch, da es Ihnen ermöglicht, oder jemand anderes, ein Objekt in die Exception. Wenn dieses Objekt nicht serialisierbar dann Serialisierung der Ausnahme fehl.
Die Standard-Implementierung der Data-Eigenschaft ist eine grundlegende überprüfung zur Sicherstellung, dass ein Objekt Hinzugefügt werden, müssen serialisierbar ist. Aber es ist fehlerhaft in mehrfacher Hinsicht
Ja, aber früher gab es (kein Wortspiel beabsichtigt) Ausnahmen.
In anderen Worten, alle Ausnahmen müssen serialisierbar sein,, aber einige benutzerdefinierte Ausnahmen von third-party-code kann nicht werden, je nachdem, wie Sie umgesetzt werden.
Beispielsweise, in den .NET 1.0-ära, Ausnahmen von der offiziellen Microsoft-Oracle-Datenbank-Anbieter wurden nicht serialisierbar sind, aufgrund von Fehlern in Ihrem code.
Diese Frage wurde bereits ausreichend beantwortet worden sein, aber für Programmierer, die mit C# oder Serialisierung, ich denke, es ist tatsächlich sehr hilfreich zu betonen, dass im Allgemeinen, Ausnahmen sind NICHT serializable!
Das klingt vielleicht etwas provokant, aber lassen Sie mich erklären.
Es ist wahr, dass alle Ausnahmen implementieren Sie die ISerializable-Schnittstelle, aber diese wird nur suggeriert, dass es sollte serialisierbar sein. Aber der Implementierung der Schnittstelle NICHT, dass ein Objekt Serialisierbar (die in diesem Kontext impliziert, dass die Ausnahme sowohl serialisiert und deserialisiert).
Die genaue Antwort auf diese Frage, wie andere haben darauf hingewiesen, ist, dass viele, aber sicherlich nicht alle Ausnahmen in der .Net Framework Serialisierbar sind. Aber wenn die Frage ist mit dem Begriff ".Net-Ausnahme" in einem breiteren Anwendungsbereich, z.B. eine Ausnahme abgeleitet aus dem System.Ausnahme, dann die bessere und hilfreiche Antwort, in Bezug auf best practices und Vermeidung von Fehlern, ist die Behauptung, die ich, wie oben bereits erwähnt, dass in der Regel-Ausnahmen sind nicht Serialisierbar.
Ist hier, warum:
Wie zuvor erwähnt, für eine Ausnahme zu sein, wirklich Serialisierbar, es muss die richtige Konstruktor
ctor(SerializationInfo, StreamingContext)
und es muss eingerichtet werden, mit dem richtigen Attribut. Wichtig ist, dass keine dieser Einschränkungen compiler-Fehler verursachen, wenn Sie weggelassen!Was dies bedeutet ist, dass KEINE Klasse, die von Exception-Serialisierbar ist, es sei denn, diese zusätzliche, optional (aus compiler-Sicht) Schritte unternommen werden.
I. e. alle ungewürzter/ahnungslos Programmierer, leitet eine neue Ausnahme wie unten hat, erstellt einfach eine Ausnahme, die NICHT Serialisierbar sind.
Visual studio hat eine große "Ausnahme" - snippet können Sie generieren neue serializable Ausnahmen ziemlich schnell. Aber selbst in diesem Fall, es gibt nichts zu erinnern, oder helfen, die Programmierer eigentlich Serialisieren von Objekt-Eigenschaften. Zum Beispiel, auch wenn die Klasse weiter unten wurde der entsprechende Konstruktor und attribute, die
MyNewField
Eigenschaft nicht serialisiert werden, ohne zusätzlichen code im Konstruktor und in GetObjectData.So, der wichtigste Punkt ist hier, dass, wenn Sie müssen sich auf richtige Ausnahme Serialisierung & Deserialisierung aus irgendeinem Grund, sollte vollkommen bewusst, dass, wenn es um benutzerdefinierten code oder Baugruppen, es gibt keine Garantie, dass es funktionieren wird. Auch, weil die erforderliche Konstruktor ist in der Regel geschützt, Sie wird nicht unbedingt in der Lage, leicht stellen Sie sicher, dass es vorhanden ist (ohne Reflexion).
In meinen eigenen Projekten habe ich auf einige Punkte erstellt Ausnahme "Proxies" speichern können, sind einige Informationen (z.B. Message etc) von den Ausnahmen, die nicht serialisierbar sind sich. Diese können verwendet werden, zu serialisieren einige der Informationen, oder alternativ zu Deserialisieren von Daten, geschrieben von einer Ausnahme, die nicht den entsprechenden Konstruktor.
System.Exception
implementiertISerializable
, aber Nachkommen kann nicht deserialisiert werden, wenn Sie nicht implementieren die richtige überladenen Konstruktor mit Signatur(SerializationInfo,StreamingContext)
.System.Exception
implementiertISerializable
und es ist die Basisklasse für alle Ausnahmen, also ja.Finden Sie unter: http://msdn.microsoft.com/en-us/library/system.exception.aspx