2009-11-20 6 views
6

Ich erhalte den folgenden Fehler in meiner Anwendung:Wie kann ich herausfinden, welches Objekt in ASP.NET nicht serialisiert werden kann?

Kann den Sitzungsstatus serialisieren. In ‚State‘ und ‚SQL Server‘ -Modus, ASP.NET wird die Sitzung Zustandsobjekte, und als Ergebnis nicht serialisierbaren Objekte oder MarshalByRef Objekte sind serialisiert nicht gestattet. Die gleiche Einschränkung gilt gilt, wenn ähnliche Serialisierung von benutzerdefinierten Sitzungszustandsspeicher im benutzerdefinierten Modus erfolgt.

Der Stack-Trace liefert keine guten Informationen darüber, welches Objekt nicht serialisiert werden kann. Gibt es einen guten Weg, das Problemkind zu finden?

Bearbeiten: Ich habe das Problem gefunden, ich habe versucht, eine Linq-Anweisung (nicht ausgeführt) zu serialisieren. Aber ich werde versuchen, eine Antwort zu wählen, die dieses Problem am besten gelöst hätte.

+0

Es sollte eigentlich nicht so schwer sein, mit einer Funktion zu kommen, die rekursiv alle Referenzen eines Objekts findet und festzustellen, ob das alles nicht als [Serializable] markiert ist. –

+0

Woher wissen Sie, welche serialisiert und zur Sitzung hinzugefügt werden? –

Antwort

5

Wirklich, sollten Sie vor allem Ihre eigenen Zustandsdaten werden Speichern/Objekte (idealerweise als DTO Klassen modelliert), wobei in diesem Fall die Antwort lautet: jede Sie Marke als [Serializable] oder ISerializable. Sie sollten keine rohen UI-Steuerelemente oder andere unbekannte Objekte zum Sitzungsstatus hinzufügen. Insbesondere aus den Gründen like this, die einen größeren Leistungseinfluss auf eine App vor ein paar Tagen hatten.

+0

+1 Guter Punkt und informativer Link. – IrishChieftain

+0

@Marc Gravell: Ich dachte, ich speicherte ein IEnumerable >, das Problem war, dass ich nur die Linq-Klausel gespeichert wurde, aber an anderen Stellen war ich zuerst mit der Erweiterung ToList() aufzulisten. –

0

Das beste, was ich in einer ähnlichen Situation tun könnte, ist, jedes Objekt zu betrachten, auf das die Session verweist, und es auf das Vorhandensein des Serializable-Attributs zu überprüfen (oder dass das Objekt die ISerialzable-Schnittstelle implementiert).

2

MbUnit (jetzt Gallio) hat einen Assert.IsSerializable() Test, der hier nützlich sein könnte.

+0

Ich habe einen Komponententest erstellt, der eine binäre Serialisierung in der Klasse durchgeführt hat, die ich für den Schuldigen hielt. –

0

Sie können die Tätertypen finden, die die Serialisierungsausnahme durch Debugging des .NET Framework-Codes auslösen. Zumindest habe ich das getan.

1

Sie können versuchen, das Objekt zu serialisieren und das System.Runtime.Serialization.SerializationException untersuchen, das ausgelöst wird, wenn es nicht serialisierbar ist. Es sollte Ihnen sagen, welches Mitglied oder Elternteil des Objekts nicht serialisiert werden kann.

Beispielcode:

var f = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
f.Serialize(new System.IO.MemoryStream(), yourObject); 
+1

Explosion aus der Vergangenheit hier. Aber ja, ich habe jetzt das Gefühl, dass ich in dieser Ausnahme mehr Einzelheiten gesehen habe, als wenn ich die Frage gepostet habe. –

Verwandte Themen