725 Stimmen

Was ist der Unterschied zwischen Serialisierung und Marshaling?

Ich weiß, dass im Zusammenhang mit verschiedenen verteilten Techniken (z. B. RPC) der Begriff "Marshaling" verwendet wird, aber ich verstehe nicht, worin der Unterschied zur Serialisierung besteht. Werden nicht beide Objekte in eine Reihe von Bits umgewandelt?

Verwandt:

Was ist Serialisierung?

Was ist Object Marshalling?

549voto

Jeffrey Hantin Punkte 34609

Marshaling und Serialisierung sind lose im Kontext des Remote Procedure Call synonym, aber semantisch unterschiedlich, was die Absicht betrifft.

Insbesondere geht es beim Marshaling darum, Parameter von hier nach dort zu bringen, während es bei der Serialisierung darum geht, strukturierte Daten in eine oder aus einer primitiven Form wie einem Bytestrom zu kopieren. In diesem Sinne ist die Serialisierung ein Mittel zur Durchführung von Marshaling, wobei in der Regel eine Pass-by-Value-Semantik implementiert wird.

Es ist auch möglich, dass ein Objekt durch eine Referenz übertragen wird, wobei die Daten "auf dem Draht" einfach Standortinformationen für das ursprüngliche Objekt sind. Ein solches Objekt kann jedoch immer noch für eine Werteserialisierung geeignet sein.

Wie @Bill erwähnt, kann es zusätzliche Metadaten geben, z. B. den Ort der Codebasis oder sogar den Code der Objektimplementierung.

4 Stimmen

Gibt es ein Wort, das gleichzeitig serialisieren und deserialisieren bedeutet? Ich brauche einen Namen für eine Schnittstelle mit diesen Methoden.

1 Stimmen

@raffian, meinen Sie eine Schnittstelle, die von dem Objekt implementiert wird, das die Serialisierung und Deserialisierung durchläuft, oder von dem Objekt, das für die Verwaltung des Prozesses verantwortlich ist? Die Schlüsselwörter, die ich vorschlagen würde, sind "Serializable" bzw. "Formatter"; dekorieren Sie mit führenden I , Änderungen der Großschreibung usw. nach Bedarf.

0 Stimmen

@JeffreyHantin Ein Objekt, das für die Verwaltung des Prozesses verantwortlich ist, ist das, was ich meinte; ich verwende ISerializer jetzt, aber das ist nur halb richtig :)

319voto

Nasir Ali Punkte 2651

Beide haben eines gemeinsam - das ist Serialisierung ein Objekt. Die Serialisierung wird verwendet, um Objekte zu übertragen oder zu speichern. Aber:

  • Serialisierung: Wenn Sie ein Objekt serialisieren, werden nur die Mitgliedsdaten dieses Objekts in den Bytestrom geschrieben, nicht der Code, der das Objekt tatsächlich implementiert.
  • Marschieren: Der Begriff "Marshalling" wird verwendet, wenn wir über Folgendes sprechen Übergabe von Objekten an entfernte Objekte (RMI) . Beim Marshalling wird das Objekt serialisiert (die Mitgliedsdaten werden serialisiert) + Die Codebase ist beigefügt.

Die Serialisierung ist also ein Teil des Marshalling.

CodeBase ist eine Information, die dem Empfänger von Object mitteilt, wo die Implementierung dieses Objekts zu finden ist. Jedes Programm, das ein Objekt an ein anderes Programm weitergeben will, das es noch nicht kennt, muss die Codebase angeben, damit der Empfänger weiß, wo er den Code herunterladen kann, wenn er ihn nicht lokal zur Verfügung hat. Der Empfänger wird bei der Deserialisierung des Objekts die Codebase abrufen und den Code von diesem Ort laden.

70 Stimmen

+1 für die Definition dessen, was CodeBase bedeutet in diesem Zusammenhang

3 Stimmen

Marshaling ohne Serialisierung ist möglich. Siehe Swing's invokeAndWait und Formulare Invoke die einen synchronen Aufruf an den UI-Thread ohne Serialisierung bereitstellen.

2 Stimmen

"nicht der Code, der das Objekt tatsächlich implementiert": Sind damit die Klassenmethoden gemeint? oder was bedeutet das? Können Sie das bitte erklären.

123voto

Bill the Lizard Punkte 384619

Von der Marshalling (Informatik) Wikipedia-Artikel:

Der Begriff "marshal" wird in der Python-Standardbibliothek als Synonym für "serialisieren" angesehen 1 aber die Begriffe sind im Java-bezogenen RFC 2713 nicht synonym:

Ein Objekt zu "marshalen" bedeutet, seinen Zustand und seine Codebasis(n) so aufzuzeichnen, dass beim "unmarshalen" des marshalen Objekts eine Kopie des ursprünglichen Objekts erhalten wird, möglicherweise durch automatisches Laden der Klassendefinitionen des Objekts. Sie können jedes Objekt, das serialisierbar oder remote ist, marshalen. Marshalling ist wie Serialisierung, nur dass beim Marshalling auch Codebases aufgezeichnet werden. Das Marshalling unterscheidet sich von der Serialisierung dadurch, dass beim Marshalling entfernte Objekte besonders behandelt werden. (RFC 2713)

Ein Objekt zu "serialisieren" bedeutet, seinen Zustand so in einen Bytestrom umzuwandeln, dass der Bytestrom wieder in eine Kopie des Objekts umgewandelt werden kann.

Das Rangieren spart also auch die codebase eines Objekts im Bytestrom zusätzlich zu seinem Zustand.

2 Stimmen

Sie meinen, dass ein Objekt, wenn es desialisiert ist, nur einen Zustand haben kann, es gibt keine Codebasis, d.h. keine seiner Funktionen kann aufgerufen werden, es ist nur ein strukturierter Datentyp. Und wenn das gleiche Objekt marshalled dann wird es seine Codebasis zusammen mit Struktur und einmal kann seine Funktionen aufrufen?

21 Stimmen

"Codebase" bedeutet nicht wirklich "Code". Aus "Wie Codebase funktioniert" ( goo.gl/VOM2Ym ) Codebase ist ganz einfach die Art und Weise, wie Programme, die die RMI-Semantik des Remote Class Loading verwenden, neue Klassen finden. Wenn der Absender eines Objekts dieses Objekt zur Übertragung an eine andere JVM serialisiert, versieht er den serialisierten Bytestrom mit Informationen, die als Codebase bezeichnet werden. Diese Informationen teilen dem Empfänger mit, wo die Implementierung dieses Objekts zu finden ist. Die eigentliche Information, die in der Codebase-Annotation gespeichert ist, ist eine Liste von URLs, von denen die Klassendatei für das benötigte Objekt heruntergeladen werden kann.

2 Stimmen

@Neurone Diese Definition ist spezifisch für Jini und RMI. "Codebase" ist ein allgemeiner Begriff. de.wikipedia.org/wiki/Codebase

39voto

Om Sao Punkte 5662

Zuerst die Grundlagen

Byte-Stream - Stream ist eine Folge von Daten. Input Stream - liest Daten von der Quelle. Output Stream - schreibt Daten an das Ziel. Java Byte Streams werden für die byteweise Eingabe/Ausgabe (8 Bits auf einmal) verwendet. Ein Byte Stream eignet sich für die Verarbeitung von Rohdaten wie Binärdateien. Java Character Streams werden für die Eingabe/Ausgabe von 2 Bytes auf einmal verwendet, da Zeichen in Java unter Verwendung der Unicode-Konventionen mit 2 Bytes für jedes Zeichen gespeichert werden. Zeichenströme sind nützlich, wenn wir Textdateien verarbeiten (lesen/schreiben).

RMI (Remote Method Invocation) - eine API, die einen Mechanismus zur Erstellung verteilter Anwendungen in Java bietet. RMI ermöglicht es einem Objekt, Methoden eines Objekts aufzurufen, das in einer anderen JVM läuft.


Beide Serialisierung y rangieren. werden lose als Synonyme verwendet. Hier sind einige Unterschiede.

Serialisierung - Datenelemente eines Objekts werden in binärer Form oder als Byte Stream geschrieben (und können dann in eine Datei/Speicher/Datenbank usw. geschrieben werden). Sobald die Datenelemente eines Objekts in die Binärform geschrieben sind, können keine Informationen über die Datentypen mehr gespeichert werden.

enter image description here

rangieren. - Das Objekt wird serialisiert (in einen Byte-Stream im Binärformat) mit angehängtem Datentyp + Codebase und dann übergeben Entferntes Objekt (RMI) . Durch Marshalling wird der Datentyp in eine vorgegebene Namenskonvention umgewandelt, so dass er in Bezug auf den ursprünglichen Datentyp rekonstruiert werden kann.

enter image description here

Die Serialisierung ist also ein Teil des Marshalling.

CodeBase ist eine Information, die dem Empfänger von Object mitteilt, wo die Implementierung dieses Objekts zu finden ist. Jedes Programm, das ein Objekt an ein anderes Programm weitergeben möchte, das es noch nicht kennt, muss die Codebase angeben, damit der Empfänger weiß, wo er den Code herunterladen kann, falls er ihn nicht lokal zur Verfügung hat. Der Empfänger wird bei der Deserialisierung des Objekts die Codebase abrufen und den Code von diesem Ort laden. (Kopiert aus der Antwort von @Nasir)

Serialisierung ist fast wie ein dummer Speicherauszug des von dem/den Objekt(en) verwendeten Speichers, während rangieren. speichert Informationen über benutzerdefinierte Datentypen.

In gewisser Weise führt die Serialisierung das Marshalling mit der Implementierung von Pass-by-Value durch, da keine Informationen über den Datentyp übergeben werden, sondern nur die primitive Form an den Byte-Stream übergeben wird.

Bei der Serialisierung kann es zu Problemen mit Big-Endian und Small-Endian kommen, wenn der Datenstrom von einem Betriebssystem zu einem anderen übertragen wird und die verschiedenen Betriebssysteme die gleichen Daten auf unterschiedliche Weise darstellen. Andererseits ist das Marshalling durchaus geeignet, um zwischen Betriebssystemen zu migrieren, da das Ergebnis eine Darstellung auf höherer Ebene ist.

1 Stimmen

Vielen Dank für Ihre Erläuterungen und Ihr Bilddiagramm.

21voto

Uri Punkte 86472

Ich denke, der Hauptunterschied besteht darin, dass beim Marshalling auch die Codebasis berücksichtigt wird. Mit anderen Worten, Sie können ein Objekt nicht in eine zustandsgleiche Instanz einer anderen Klasse umwandeln.

Serialisierung bedeutet lediglich, dass Sie das Objekt speichern und einen gleichwertigen Zustand wiederherstellen können, auch wenn es sich um eine Instanz einer anderen Klasse handelt.

In der Regel handelt es sich jedoch um Synonyme.

2 Stimmen

Meinen Sie, dass ein Objekt, wenn es desialisiert ist, nur einen Zustand haben kann, d.h. es gibt keine Codebasis, d.h. keine seiner Funktionen kann aufgerufen werden, es ist nur ein strukturierter Datentyp. Und wenn dasselbe Objekt marshalled wird, dann hat es seine Codebasis zusammen mit der Struktur und man kann seine Funktionen aufrufen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X