Ich weiß, dass in Bezug auf mehrere verteilte Techniken (wie RPC) der Begriff "Marshaling" verwendet wird, verstehe aber nicht, wie er sich von der Serialisierung unterscheidet. Verwandeln sie nicht beide Objekte in eine Reihe von Bits?
Ich weiß, dass in Bezug auf mehrere verteilte Techniken (wie RPC) der Begriff "Marshaling" verwendet wird, verstehe aber nicht, wie er sich von der Serialisierung unterscheidet. Verwandeln sie nicht beide Objekte in eine Reihe von Bits?
Marshaling und Serialisierung sind im Kontext eines Remoteprozeduraufrufs lose synonym, unterscheiden sich jedoch absichtlich semantisch.
Beim Marshalling geht es insbesondere darum, Parameter von hier nach dort abzurufen, während bei der Serialisierung strukturierte Daten in oder aus einer primitiven Form wie einem Bytestream kopiert werden. In diesem Sinne ist die Serialisierung ein Mittel zum Durchführen von Marshalling, wobei normalerweise eine Pass-by-Value-Semantik implementiert wird.
Es ist auch möglich, dass ein Objekt als Referenz gemarshallt wird. In diesem Fall sind die Daten "auf dem Draht" einfach Standortinformationen für das ursprüngliche Objekt. Ein solches Objekt kann jedoch weiterhin für eine Wertserialisierung geeignet sein.
Wie @Bill erwähnt, kann es zusätzliche Metadaten geben, z. B. den Speicherort der Codebasis oder sogar den Code für die Objektimplementierung.
I
Änderungen der Groß- und Kleinschreibung usw. nach Bedarf.Beide haben eines gemeinsam: Sie serialisieren ein Objekt. Die Serialisierung wird verwendet, um Objekte zu übertragen oder zu speichern. Aber:
Serialisierung ist also Teil von Marshalling.
CodeBase ist eine Information, die dem Empfänger von Object mitteilt, wo sich die Implementierung dieses Objekts befindet. Jedes Programm, das glaubt, jemals ein Objekt an ein anderes Programm übergeben zu können, das es möglicherweise noch nicht gesehen hat, muss die Codebasis festlegen, damit der Empfänger weiß, von wo er den Code herunterladen kann, wenn der Code lokal nicht verfügbar ist. Der Empfänger ruft beim Deserialisieren des Objekts die Codebasis ab und lädt den Code von diesem Ort.
quelle
invokeAndWait
und Forms'sInvoke
, die einen synchronen Aufruf des UI-Threads ohne Serialisierung durchführen.the implementation of this object
? Könnten Sie ein konkretes Beispiel fürSerialization
und gebenMarshalling
?Aus dem Wikipedia-Artikel Marshalling (Informatik) :
Beim Marshalling wird also zusätzlich zu seinem Status auch die Codebasis eines Objekts im Bytestream gespeichert.
quelle
Ich denke, dass der Hauptunterschied darin besteht, dass Marshalling angeblich auch die Codebasis betrifft. Mit anderen Worten, Sie könnten ein Objekt nicht in eine zustandsäquivalente Instanz einer anderen Klasse ein- und ausmarschieren. .
Serialisierung bedeutet nur, dass Sie das Objekt speichern und einen äquivalenten Status wiedererlangen können, selbst wenn es sich um eine Instanz einer anderen Klasse handelt.
Davon abgesehen sind sie typischerweise Synonyme.
quelle
Marshaling bezieht sich auf die Konvertierung der Signatur und der Parameter einer Funktion in ein Einzelbyte-Array. Speziell für den Zweck von RPC.
Serialisierung bezieht sich häufiger auf die Konvertierung eines gesamten Objekts / Objektbaums in ein Byte-Array. Marshaling serialisiert Objektparameter, um sie der Nachricht hinzuzufügen und über das Netzwerk zu übertragen. * Die Serialisierung kann auch zur Speicherung auf der Festplatte verwendet werden. *
quelle
Marshalling ist die Regel, um dem Compiler mitzuteilen, wie die Daten in einer anderen Umgebung / einem anderen System dargestellt werden. Zum Beispiel;
Wie Sie sehen können, werden zwei verschiedene Zeichenfolgenwerte als unterschiedliche Werttypen dargestellt.
Die Serialisierung konvertiert nur den Objektinhalt, nicht die Darstellung (bleibt gleich) und befolgt die Serialisierungsregeln (was exportiert werden soll oder nicht). Beispielsweise werden private Werte nicht serialisiert, öffentliche Werte yes und die Objektstruktur bleiben gleich.
quelle
Hier sind spezifischere Beispiele für beides:
Beispiel für die Serialisierung:
Bei der Serialisierung werden Daten auf eine Weise reduziert, die später gespeichert und nicht reduziert werden kann.
Marshalling-Demo:
(MarshalDemoLib.cpp)
(MarshalDemo.c)
Beim Marshalling müssen Daten nicht unbedingt reduziert werden, sondern müssen in eine andere alternative Darstellung umgewandelt werden. Alles Casting ist Marshalling, aber nicht alles Marshalling ist Casting.
Das Marshaling erfordert keine dynamische Zuordnung, sondern kann auch nur eine Transformation zwischen Strukturen sein. Beispielsweise könnten Sie ein Paar haben, aber die Funktion erwartet, dass das erste und das zweite Element des Paares umgekehrt sind. Wenn Sie ein Paar auf ein anderes übertragen / memcpy, wird dies nicht erledigt, da fst und snd umgedreht werden.
Das Konzept des Marshalling wird besonders wichtig, wenn Sie sich mit markierten Gewerkschaften vieler Typen befassen. Beispielsweise könnte es schwierig sein, eine JavaScript-Engine dazu zu bringen, eine "c-Zeichenfolge" für Sie zu drucken, aber Sie können sie bitten, eine umschlossene c-Zeichenfolge für Sie zu drucken. Oder wenn Sie eine Zeichenfolge aus der JavaScript-Laufzeit in einer Lua- oder Python-Laufzeit drucken möchten. Sie sind alle Saiten, kommen aber oft nicht ohne Marshall aus.
Ein Ärger, den ich kürzlich hatte, war, dass JScript-Arrays als "__ComObject" auf C # gemarshallt sind und keine dokumentierte Möglichkeit zum Spielen mit diesem Objekt haben. Ich kann die Adresse finden, an der sie sich befindet, aber ich weiß wirklich nichts anderes darüber. Der einzige Weg, dies wirklich herauszufinden, besteht darin, sie auf jede mögliche Weise zu durchsuchen und hoffentlich nützliche Informationen darüber zu finden. So wird es einfacher, ein neues Objekt mit einer benutzerfreundlicheren Oberfläche wie Scripting.Dictionary zu erstellen, die Daten aus dem JScript-Array-Objekt darin zu kopieren und dieses Objekt anstelle des Standard-Arrays von JScript an C # zu übergeben.
test.js:
YetAnotherTestObject.cs
Ein weiteres interessantes Konzept ist, dass Sie möglicherweise wissen, wie man Code schreibt, und dass ein Computer weiß, wie man Anweisungen ausführt. Als Programmierer stellen Sie also effektiv das Konzept auf, was der Computer von Ihrem Gehirn zum Programm tun soll Bild. Wenn wir gut genug Marshaller hätten, könnten wir uns nur überlegen, was wir tun / ändern wollen, und das Programm würde sich auf diese Weise ändern, ohne auf der Tastatur zu tippen. Wenn Sie also die Möglichkeit haben könnten, alle physischen Veränderungen in Ihrem Gehirn für die wenigen Sekunden zu speichern, in denen Sie wirklich ein Semikolon schreiben möchten, könnten Sie diese Daten in ein Signal umwandeln, um ein Semikolon zu drucken, aber das ist ein Extrem.
quelle
Marshalling findet normalerweise zwischen relativ eng miteinander verbundenen Prozessen statt. Serialisierung hat nicht unbedingt diese Erwartung. Wenn Sie beispielsweise Daten zwischen Prozessen zusammenstellen, möchten Sie möglicherweise lediglich eine REFERENZ an potenziell teure Daten senden, um sie wiederherzustellen, während Sie bei der Serialisierung alles speichern möchten, um die Objekte beim Deserialisieren ordnungsgemäß neu zu erstellen.
quelle
Mein Verständnis von Marshalling unterscheidet sich von den anderen Antworten.
Serialisierung:
Erstellen oder Rehydrieren einer Drahtformatversion eines Objektgraphen unter Verwendung einer Konvention.
Marshalling:
Erstellen oder Rehydrieren einer Drahtformatversion eines Objektdiagramms mithilfe einer Zuordnungsdatei, damit die Ergebnisse angepasst werden können. Das Tool beginnt möglicherweise mit der Einhaltung einer Konvention. Der wichtige Unterschied besteht jedoch in der Möglichkeit, die Ergebnisse anzupassen.
Erste Auftragsentwicklung:
Marshalling ist wichtig im Rahmen der ersten Vertragsentwicklung.
quelle
Hydrating an object is taking an object that exists in memory, that doesn't yet contain any domain data ("real" data), and then populating it with domain data (such as from a database, from the network, or from a file system).
Grundlagen zuerst
Byte Stream - Stream ist eine Folge von Daten. Eingabestream - Liest Daten aus der Quelle. Ausgabestream - schreibt Daten in die Desitnation. Java-Byte-Streams werden verwendet, um die Eingabe / Ausgabe byteweise (jeweils 8 Bit) durchzuführen. Ein Bytestream eignet sich zur Verarbeitung von Rohdaten wie Binärdateien. Java-Zeichenströme werden verwendet, um jeweils 2 Bytes einzugeben / auszugeben, da Zeichen unter Verwendung von Unicode-Konventionen in Java mit 2 Bytes für jedes Zeichen gespeichert werden. Der Zeichenstrom ist nützlich, wenn wir Textdateien verarbeiten (lesen / schreiben).
RMI (Remote Method Invocation) - eine API, die einen Mechanismus zum Erstellen verteilter Anwendungen in Java bereitstellt. Mit dem RMI kann ein Objekt Methoden für ein Objekt aufrufen, das in einer anderen JVM ausgeführt wird.
Sowohl Serialisierung als auch Marshalling werden lose als Synonyme verwendet. Hier sind einige Unterschiede.
Serialisierung - Datenelemente eines Objekts werden in Binärform oder Byte-Stream geschrieben (und können dann in Datei / Speicher / Datenbank usw. geschrieben werden). Sobald Objektdatenelemente in eine binäre Form geschrieben wurden, können keine Informationen über Datentypen beibehalten werden.
Marshalling - Das Objekt wird serialisiert (zum Byte-Stream im Binärformat), wobei Datentyp + Codebasis angehängt und dann Remote Object (RMI) übergeben werden . Durch Marshalling wird der Datentyp in eine vorgegebene Namenskonvention umgewandelt, sodass er in Bezug auf den ursprünglichen Datentyp rekonstruiert werden kann.
Serialisierung ist also Teil von Marshalling.
CodeBase ist eine Information, die dem Empfänger von Object mitteilt, wo sich die Implementierung dieses Objekts befindet. Jedes Programm, das glaubt, jemals ein Objekt an ein anderes Programm übergeben zu können, das es möglicherweise noch nicht gesehen hat, muss die Codebasis festlegen, damit der Empfänger weiß, von wo er den Code herunterladen kann, wenn der Code lokal nicht verfügbar ist. Der Empfänger ruft beim Deserialisieren des Objekts die Codebasis ab und lädt den Code von diesem Ort. (Von @Nasir Antwort kopiert)
Die Serialisierung ist fast wie ein dummer Speicherauszug des von den Objekten verwendeten Speichers, während Marshalling Informationen zu benutzerdefinierten Datentypen speichert.
In gewisser Weise führt die Serialisierung das Marshalling mit der Implementierung des Pass-by-Werts durch, da keine Informationen vom Datentyp übergeben werden, sondern nur die primitive Form an den Byte-Stream übergeben wird.
Bei der Serialisierung können einige Probleme im Zusammenhang mit Big-Endian und Small-Endian auftreten, wenn der Stream von einem Betriebssystem zu einem anderen wechselt, wenn die verschiedenen Betriebssysteme unterschiedliche Mittel zur Darstellung derselben Daten haben. Auf der anderen Seite ist Marshalling für die Migration zwischen Betriebssystemen völlig in Ordnung, da das Ergebnis eine Darstellung auf höherer Ebene ist.
quelle
Marshaling verwendet tatsächlich den Serialisierungsprozess, aber der Hauptunterschied besteht darin, dass bei der Serialisierung nur Datenelemente und das Objekt selbst serialisiert werden, keine Signaturen, sondern in der Marshalling Object + -Codebasis (deren Implementierung) ebenfalls in Bytes umgewandelt werden.
Marshalling ist der Prozess zum Konvertieren von Java-Objekten in XML-Objekte mit JAXB, damit es in Webdiensten verwendet werden kann.
quelle
Stellen Sie sich diese als Synonyme vor, beide haben einen Produzenten, der Sachen an einen Konsumenten sendet ... Am Ende werden Instanzfelder in einen Bytestream geschrieben, und das andere Ende ist umgekehrt und hat dieselben Instanzen.
NB - Java RMI enthält auch Unterstützung für den Transport von Klassen, die im Empfänger fehlen ...
quelle