2009-04-21 17 views
2

Wie funktioniert die Serialisierung von Objekten? Wie wurde das Objekt deserialisiert und eine Instanz wird aus dem serialisierten Datum ohne Aufruf eines Konstruktors erstellt?Serialisierung von Objekten

+0

http://forum.codecall.net/csharp-tutorials/7918-tutorial-visual-studio-2008-c-serialization.html –

+0

lassen Sie mich wissen, wenn dies nicht Ihre Antwort ist .. –

Antwort

6

Ich habe diese Antwort Sprache Agnostiker gehalten, da eine Sprache nicht angegeben wurde.

Wenn das Objekt serialisiert ist, werden alle erforderlichen Informationen zum Neuaufbau in einer Weise codiert, die abgerufen werden kann. Dies umfasst normalerweise den Typ des Objekts sowie den Wert aller Instanzvariablen.

Wenn das Objekt deserialisiert wird, wird ein Bereich im Speicher der richtigen Größe zugewiesen und mit den serialisierten Informationen gefüllt, so dass das neue Objekt identisch mit dem serialisierten Objekt ist.

Das laufende Programm kann sich dann auf dieses neue Objekt im Speicher beziehen, ohne den Konstruktor tatsächlich aufrufen zu müssen.

Es gibt viele kleine Details, die dies nicht erklären, aber das ist die allgemeine Idee der Serialisierung/Deserialisierung.

+0

+1 Ja denke ich darauf bezieht sich seine Frage. – TStamper

0

Sprechen Sie über Java? Wenn dies der Fall ist, ist die Serialisierung ein Mechanismus für die Erzeugung eines extralingualen Objekts. Es ist eine Hintertür, die nativen Code verwendet, um das Objekt ohne Aufruf von Konstruktoren zu erstellen. Daher müssen Sie beim Entwerfen einer Klasse für die Serialisierbarkeit sicherstellen, dass eine durch Deserialisierung erstellte Klasse die gleichen Invarianten (Schlüsselfelder, die initialisiert werden) wie den Konstruktorpfad verwaltet. Eine dritte Möglichkeit zum Erstellen von Objekten in Java ist das Klonen, und ähnliche Probleme treten auf.

Cloning und Serialisierung interagieren nicht gut mit der Verwendung von endgültigen Feldern, wenn Sie den Wert dieses Felds auf etwas anderes einstellen müssen als das, was vom Klon- oder Deserialisierungsprozess zurückgegeben wird.

Josh Blochs "Effektives Java" enthält einige Kapitel, in denen diese Probleme genauer erläutert werden.

(diese Antwort auf andere Sprachen gelten, aber ich habe nur die Serialisierung in Java verwendet)

0

In Bezug auf .NET: diese Antwort keine endgültige oder Lehrbuch ist, und ich könnte all-out falsch sein ...

. NET Serialisierung muss in Binär gegenüber anderen (XML oder ein XML-Derivat typischerweise) getrennt werden. Binäre Serialisierung ist für mich meistens eine Black-Box, aber es erlaubt dem Objekt, in ihrem aktuellen Zustand serialisiert und wiederhergestellt zu werden. Bei der XML-Serialisierung werden die öffentlichen Felder/Eigenschaften eines Objekts normalerweise nur serialisiert, sofern sie nicht durch Hinzufügen einer benutzerdefinierten ISerializable-Implementierung überschrieben werden.

Im Fall der XML-Serialisierung glaube ich, dass .NET Reflection verwendet, um zu bestimmen, welche Felder und Eigenschaften in die entsprechenden Elemente konvertiert werden. Durch Hinzufügen eines [XMLSerializable] -Attributs wird ein Standardverhalten implementiert, das durch Anwenden anderer Attribute auf Feldebene (wie [XMLAttribute]) angepasst werden kann.

Die Metadaten (von denen Reflection abhängt) speichern alle Objektelemente sowie deren Attribute und Adressen, wodurch der Serializer bestimmen kann, wie er die Ausgabe erstellen soll.

Verwandte Themen