Ich bin unklar, wie Serialisierung / Deserialisierung auf typisierte Objekte in JavaScript funktionieren soll. Zum Beispiel habe ich ein "MapLayer" -Objekt, das verschiedene Mitglieder und Arrays enthält. Ich habe den folgenden Code geschrieben (aber noch nicht getestet), um zu versuchen, ihn zu serialisieren:
%Vor%Meine Frage ist, wie das resultierende Objekt als MapLayer-Objekt und nicht als generisches Objekt deserialisiert werden soll. Und wie sollen alle Sprite-Instanzen als Sprites deserialisiert werden? Sollte ich "new MapLayer ()" anstelle von "{}" verwenden? Oder soll ich einfach die Prototyp- und Konstruktoreigenschaften des Objekts in die Serialisierung einbeziehen? Sonst was ich vermisse? Mache ich das auf eine dumme Weise? Es gibt zwei Gründe, warum ich keinen generischen Serialisierungs- / Deserialisierungscode verwende:
Bearbeiten: Entschuldigen Sie meinen Mangel an richtiger Terminologie; JavaScript ist eine meiner weniger Expertensprachen. Was ich meine, wenn ich "Typed Object" sagte, ist ein Objekt mit einem Konstruktor. In diesem Beispiel lautet mein Konstruktor:
%Vor%Bearbeiten 2: Ich nehme den Code aus der Antwort von Šime Vidas und füge ein verwandtes Objekt namens "Device" hinzu:
%Vor%Nun stellt sich die Frage, wie man solche abhängigen Objekte am besten einbaut, weil der "Typ" (Prototyp?) des Objekts wieder durch JSON verloren geht. Anstatt den Konstruktor auszuführen, ändern wir einfach die Funktionen serialize und deserialize, um sicherzustellen, dass das Objekt nur einmal erstellt und nicht erstellt und kopiert werden muss.
%Vor%Bearbeiten 3: Ein anderes Problem, das ich habe, ist, dass JSON nicht in IE9 zu arbeiten scheint. Ich verwende diese Testdatei:
%Vor%Und die Konsolenausgaben:
%Vor%Bearbeiten 4: Um das JSON-Problem zu beheben, muss ich am Anfang das richtige DOCTYPE-Tag einfügen.
Zunächst einmal ein einfaches Beispiel für die benutzerdefinierte Serialisierung / Deserialisierung:
%Vor%Verwendung:
Zuerst erstellen wir ein neues Instanzobjekt:
%Vor% Nun werden wir dieses Objekt mit der Methode Person.prototype.serialize
in eine Zeichenfolge serialisieren:
Dies wird diese Zeichenfolge verwenden:
%Vor% Schließlich deserialisieren wir diese Zeichenfolge mit der statischen Methode Person.deserialize
:
Nun ist person2
eine Instanz von Person
und enthält die gleichen Eigenschaftswerte wie die ursprüngliche person
-Instanz.
Live-Demo: Ссылка
Jetzt, während die statische Methode Person.deserialize
in jedem Fall erforderlich ist (sie verwendet JSON.parse
intern und ruft den Person
-Konstruktor auf, um eine neue Instanz zu initialisieren), ist andererseits die Person.prototype.serialize
-Methode wird nur benötigt, wenn die eingebaute JSON.stringify
statische Methode nicht ausreicht.
In meinem obigen Beispiel würde var string = JSON.stringify( person )
den Job ebenfalls erledigen, so dass ein benutzerdefinierter Serialisierungsmechanismus nicht benötigt wird. Siehe hier: Ссылка Allerdings ist Ihr Fall komplexer, daher müssen Sie eine benutzerdefinierte Serialisierungsfunktion definieren.
Wenn Sie sich das Projekt ST-JS ( Ссылка ) ansehen, können Sie Ihr Objektdiagramm in Java auf der Serverseite erstellen. Serialisieren Sie es in JSON und deserialisieren Sie es auf der Client-Seite (Javascript) in getippter Weise, dh die Objekte werden mit ihrem Konstruktor instanziiert und Sie können Methoden für die erstellten Objekte aufrufen.
Um ST-JS zu verwenden, sollten Sie Ihren Client-Code Java schreiben, der fast eins zu eins in Javascript konvertiert wird.
Das AJAX / JSON-Kapitel auf der Homepage der Site erläutert Ihnen, wie Sie eine JSON-Zeichenfolge analysieren und dabei die Typinformationen beibehalten.
Tags und Links javascript json serialization