2009-07-16 5 views
2

Dies ist ein C# 3.0 Winform-Problem.Deserialize von MemoryStream wirft OutOfMemory-Ausnahme in C#

Ich möchte ein großes (nicht sehr großes) kompliziertes Objekt klonen. Um es träge zu machen, seralisiere ich es zu einem MemoryStream und benutze die BinaryFormatter.UnsafeDeserialize (MemoryStream, null) -Methode, um das geklonte Objekt zu erhalten. Innerhalb der UnsafeDeserialize() -Methode wird immer eine OutOfMemory-Ausnahme ausgelöst. Die Erinnerung sollte ausreichen.

Ich lese ein bisschen darüber als eine. NET-Bug, aber nicht sicher, ob es hier der Fall ist.

Jeder hat eine Idee, warum das passiert? Irgendeine Arbeitsumgebung? Vielen Dank.

+4

Könnten Sie tatsächlich Code posten? –

+0

(auf Kommentar geantwortet) –

Antwort

2

Vielleicht eine dumme Frage aber erinnern Sie sich daran, den MemoryStream an den Anfang des Streams zurückzuspulen, bevor Sie ihn deserialisieren?

Es könnte auch helfen, etwas von Ihrem Code zu teilen.

+0

Ja, ich habe die Position vor der Deserialisierung auf 0 gesetzt. – Steve

1

Warum verwenden Sie UnsafeDeserialize anstelle von Deserialize?

+0

Von MSDN: "In vollständigen Vertrauensstellungen bietet UnsafeDeserialize eine bessere Leistung als Deserialize." –

+0

Das wusste ich nicht! :) Nun, das für meine Sachen zu tun! (obwohl ich finde, dass es schon schneller ist). – leppie

1

Was ist das Objekt und wie groß ist es?

Ich habe andere Leute mit ähnlichen Problemen gesehen, und in einigen Fällen hat das Umschalten auf einen anderen Serializer es behoben. Ich kann mehrere vorschlagen, die je nach Szenario gut passen. insbesondere - sind die Daten ein Baum oder ein Graph? (d. h. beziehen sich Kinderobjekte jemals auf Geschwister oder ihre Eltern? Oder nur auf ihre eigenen Kinder).

+0

Die Klasse ist eine Baumstruktur. – Steve

+0

Dann vielleicht probobuf-net betrachten; es ist schnell und effizient (Platz-weise) Binary Tree Serializer. Beachten Sie, dass es nicht mit vorhandenen serialisierten BinaryFormatter-Daten kompatibel ist. Vorbehalt: Ich bin der Autor, aber es ist kostenlos; Ich versuche dir nichts zu verkaufen. –

0

Ich schlage vor, Sie versuchen stattdessen einen FileStream und sehen, wie groß die Datei ist.

+0

Ich habe das versucht. Die Datei ist nur 58 MB groß. Also sollte es überhaupt kein Speicherproblem haben. Wenn die OutOfMemory-Ausnahme ausgelöst wird, verwendet die Anwendung nur unter 500 MB. Ich habe 4G Speicher und ich werde davon ausgehen, dass einzelne .net-Anwendung bis zu 2G Speicher verwendet. – Steve