Frage

Was passiert, wenn Sie eine Objektinstanz A haben, die auf andere Objekte verweist (z. B. Instanzen B und C), und Sie A binär in eine Datei serialisieren?Verfügen Sie jetzt über serialisierte Daten, die A, B und C umfassen?

Wie funktioniert es genau?Was erhalte ich, wenn ich die Daten deserialisiere?A, B und C??

(Fügen Sie gerne auch Erläuterungen zur internen Funktionsweise bei.)

War es hilfreich?

Lösung

Alle Verweise auf andere Objekte werden ebenfalls serialisiert. Wenn Sie die Daten deserialisieren, erhalten Sie am Ende einen vollständigen, funktionierenden Satz ihrer Daten, einschließlich der Objekte A, B und C.Das ist wahrscheinlich der Hauptvorteil der binären Serialisierung im Gegensatz zur XML-Serialisierung.

Wenn eine der anderen Klassen, auf die Ihr Objekt verweist, nicht mit dem gekennzeichnet ist [Serializable] Attribut, du bekommst ein SerializationException zur Laufzeit (dessen Bild schamlos aus dem Internet gestohlen wurde);Laufzeitfehler sehen in den aktuellen Versionen von VS nicht einmal mehr so ​​aus):

    Example of an unhandled SerializationException

Darüber hinaus bin ich mir nicht ganz sicher, welche „inneren Dinge“ Sie verstehen wollten.Serialisierung verwendet Betrachtung um durch die öffentlichen und privaten Felder von Objekten zu gehen und sie in einen Bytestrom umzuwandeln, der schließlich in einen Datenstrom geschrieben wird.Bei der Deserialisierung geschieht das Gegenteil:Aus dem Datenstrom wird ein Bytestrom eingelesen, der zur Synthese einer exakten Kopie des Objekts zusammen mit Typinformationen verwendet wird.Alle Felder im Objekt haben dieselben Werte wie zuvor;der Konstruktor ist nicht Wird aufgerufen, wenn ein Objekt deserialisiert wird.Der einfachste Weg, darüber nachzudenken, besteht darin, einfach eine zu nehmen Snapshot-in-Place des Objekts, das Sie nach Belieben in den Originalzustand zurückversetzen können.

Die Klasse, die für die eigentliche Serialisierung und Deserialisierung verantwortlich ist, wird Formatter genannt (sie erbt immer von IFormatter Schnittstelle).Seine Aufgabe besteht darin, einen „Objektgraphen“ zu generieren, bei dem es sich um einen verallgemeinerten Baum handelt, der das Objekt, das serialisiert/deserialisiert wird, als Wurzel enthält.Wie oben erwähnt, verwendet der Formatierer Reflektion, um diesen Objektgraphen zu durchlaufen und alle in diesem Objekt enthaltenen Objektverweise zu serialisieren/deserialisieren.Der Formatierer ist außerdem intelligent genug, um zu wissen, dass er kein Objekt im Diagramm mehr als einmal serialisieren darf.Wenn tatsächlich zwei Objektreferenzen auf dasselbe Objekt verweisen, wird dies erkannt und dieses Objekt wird nur einmal serialisiert.Diese und andere Logik verhindern das Eintreten in eine Endlosschleife.

Natürlich ist es einfach, ein gutes allgemeines Verständnis davon zu erlangen, wie dieser Prozess funktioniert.Es ist viel schwieriger, den Code, der ihn implementiert, tatsächlich selbst zu schreiben.Zum Glück ist das bereits für Sie erledigt.Der Sinn von .NET Framework besteht unter anderem darin, dass die gesamte komplizierte Serialisierungslogik integriert ist, so dass Sie sich darüber keine Sorgen machen müssen.Ich erhebe nicht den Anspruch, alles selbst zu verstehen, und Sie müssen es sicherlich auch nicht verstehen, um die angebotenen Funktionen in vollem Umfang nutzen zu können.Jahrelanges manuelles Schreiben des gesamten Codes ist endlich vorbei.Sie sollten sich freuen, anstatt sich über Implementierungsdetails Gedanken zu machen.:-)

Andere Tipps

Zunächst muss der Typ von Objekt A mit dem Attribut [Serializable] gekennzeichnet werden.Durch die Serialisierung von A werden alle privaten oder öffentlichen Mitgliederdaten serialisiert, sofern die Mitgliedstypen auch mit [Serializable] gekennzeichnet sind (oder um Ihr Beispiel zu verwenden, sofern die Typen von B und C mit [Serializable] gekennzeichnet sind).Versuche, Daten eines Typs, der nicht [serialisierbar] ist, direkt oder indirekt zu serialisieren, führen zu einer Ausnahme.

Einige der integrierten .NET-Typen sind bereits als [serialisierbar] markiert, einschließlich System.Int32 (int), System.Boolean (bool) usw.

Weitere Informationen zur .NET-Serialisierung finden Sie hier: http:// msdn.microsoft.com/en-us/library/4abbf6k0.aspx .

Die Objekte, auf die sich das Hauptobjekt bezieht, müssen ebenfalls [Serializable] sein.Vorausgesetzt, alles wird automatisch vom Formatierer erledigt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top