8
votes

Sérentialisation JavaScript des objets dactylographiés

Je ne suis pas clair comment la sérialisation / la désémarification est censée fonctionner sur des objets typés dans JavaScript. Par exemple, j'ai un objet "Maplayer" contenant divers membres et tableaux. J'ai écrit (mais pas encore testé) le code suivant pour tenter de le sérialiser:

SCRIPT5009: 'JSON' is undefined 
test.html, line 5 character 1


6 commentaires

Un objet avec un constructeur autre que "objet". Je ne sais pas quoi l'appeler.


Ah, vous voulez dire des objets d'instances de vos propres constructeurs ( Maplayer , Sprite , etc.) ...


Ma suggestion serait un Maplayer.Prototype.Deserialize Méthode qui prendrait une chaîne et renvoie un objet Maplayer . Je travaille sur un exemple ...


Évitez donc JSON dans ce cas alors?


La chaîne est-elle renvoyée par JSON.Stringify (YourMaplayerObj) conforme à votre exigence? Sinon, vous avez évidemment besoin d'une solution personnalisée stringify / parse ...


Ou ajoutez une méthode Tojson dans votre constructeur


3 Réponses :


8
votes

Pour un démarrage, voici un exemple simple de sérialisation / désérialisation personnalisée: xxx pré>

usage: p>

Premièrement, nous créons un nouvel objet d'instance: P >

var person2 = Person.deserialize( string );


12 commentaires

J'ai mis à jour la question. Pourquoi ne définissons-nous pas __ proto __ au lieu d'appeler le constructeur?


Un autre problème est que si j'essaie d'utiliser JSON dans IE, je reçois une erreur "JSON n'est indéfinie".


@Bluemonkmn parce que __ proto __ n'est pas standard et obsolète. Il n'a jamais été mis en œuvre dans IE (et ne sera jamais). La norme ECMAScript ne fournit aucun moyen de définir la liaison de prototype d'un objet par la suite. ... Quelle version d'IE utilisez-vous? L'objet json a été ajouté à IE8 ...


@Blememonkmn essaie console.log (JSON) dans IE. Vous obtiendriez obtiendrez '[objet json]' dans la console de la console de l'IE (F12 -> onglet de la console) ...


La console signale une erreur en utilisant le script HTML test que j'ai ajouté à ma question.


@Bluemonkmn Ah c'est parce que vous n'avez pas défini de doctype. Ajouter comme première ligne de votre document HTML. Si vous échouez de définir un DOCTYPE valide, c'est-à-dire en mode Qiiks ...


Ok, merci pour la réponse et toute votre aide. Je voulais juste une certaine confirmation que Json n'était pas vraiment "sérialisement gratuit" comme si vous obtenez avec la sérialisation binaire dans .NET. Si vous souhaitez faire quoi que ce soit sur tout le complexe, vous devez sélectionner un autre code de sérialisation dessus, il apparaît. BTW, la collecte des ordures, nettoyer efficacement tous ces objets temporaires construits lors de la désérialisation?


@Bluemonkmn avec JavaScript, la règle est qu'un objet existe dans la mémoire tant qu'il existe au moins une référence à celle-ci. Par exemple, à l'intérieur de la fonction personne.desériialize dans mon code ci-dessus, une variable locale obj est déclarée et l'objet renvoyé par json.parse est assigné à celui-ci. Maintenant, étant donné que la variable locale est la seule référence à cet objet, dès que la variable locale est détruite (dès que la fonction renvoie), l'objet sera recruté.


@ Šimevidas tandis que __ proto __ est non standard, il apparaît constructeur peut accomplir une chose similaire et est plus standard. Que pouvez-vous me dire sur l'idée de définir toutes les propriétés, puis de régler constructeur à la fonction qui construit l'objet? Cela fonctionnerait-il? Une instance de test suggère qu'il serait en chrome et c'est-à-dire.


@Bluemonkmn Je ne suis pas sûr de ce que vous voulez dire. Jetez un coup d'œil à cette démo: jsfiddle.net/zmb7y si instance de fonctionne pour Vous, s'il vous plaît, fournir une démo.


@ Šimevidas Je ne peux plus faire fonctionner plus et j'ai perdu le code qui suggérait qu'il fonctionnait, j'ai donc dû faire une erreur ou que je suis tombé sur un cas obscur que je ne puisse pas reproduire. Désolé.


JSON permet une sérialisation personnalisée en ajoutant une méthode tojson au constructeur, qui ne sera pas sérialisée. En ce qui concerne la désérialisation, vous pouvez transmettre une fonction personnalisée à la méthode json.parse comme deuxième argument, qui retournera la désérialisation d'une chaîne transmise.



1
votes

Si vous regardez le ST-JS ( http://st-js.org ), il Permet de créer votre graphique d'objet dans Java sur le côté serveur, en sérialisez-le dans JSON et de le désérialiser sur le côté client (JavaScript) de manière dactylographiée, c'est-à-dire que les objets seront instanciés à l'aide de leur constructeur et vous pouvez appeler des méthodes sur la création. objets.

Pour utiliser ST-JS, vous devriez écrire votre code client est Java, qui est converti presque un-à-un en JavaScript.

Le chapitre AJAX / JSON de la page d'accueil du site explique comment analyser une chaîne JSON tout en conservant les informations de type.


3 commentaires

Je pense que l'OP posait des questions sur les techniques d'utiliser pour leur code de code existant, plutôt qu'un cadre différent de migrer vers.


Oui, vous êtes en quelque sorte raison. Le problème que je soulignais est que pour pouvoir désérialiser de manière générique un graphique d'objets "dactylographiés" (comme dans Edition 2), vous devez en quelque sorte stocker des métadonnées sur vos "objets dactylographiés", c'est-à-dire à dire à Votre désérialiseur qui, par exemple, la propriété "Périphériques" de "personne" est une gamme de "périphérique".


Si vous regardez notre Sources La fonction Parsejson (celle-ci devrait être en mesure d'extraire facilement) utilise un champ "statique" appelé "Typedescription" qui est une simple carte - que notre cadre génère, mais qui peut également être créé manuellement.



0
votes

Ma question est la suivante: comment l'objet résultant est-il censé être désérialisé en tant qu'objet Maplayer plutôt que comme objet générique. Et comment toutes les instances Sprite sont-elles censées être désérialisées en tant que sprites.

J'ai fait un module NPM nommé ESSERIALIZER pour résoudre ce problème: sauvegardez la classe JavaScript Les valeurs d'instance lors de la sérialisation, dans le format JSON uni, ainsi que ses informations de nom de classe: xxx

plus tard, au cours de la phase de désérialisation (éventuellement sur une autre machine), l'asseritalisateur peut récursivement désérialisaliser Instance d'objet, avec toutes les informations de classe / propriété / méthode retenues, à l'aide de la même définition de classe: xxx

Dois-je utiliser "New Maplayer ()" au lieu de "{}"? Ou suis-je simplement censé inclure les propriétés de prototype et de constructeur de l'objet dans la sérialisation?

Inside Esserializer, les informations de nom de classe sont incluses lors de la sérialisation et toutes les propriétés prototypes sont ré-construites lors de la désérialisation.

Je ne veux pas sérialiser le TileSet comme un objet qui est construit comme un nouvel objet lors de la dés-sérialisation, mais plutôt comme une référence à un objet existant.

Malheureusement, c'est impossible. La sérialisation se produit sur une machine et la désérialisation peut se produire sur un autre ordinateur - de toute façon, c'est la sérialisation / la désérialisation censée faire. Ordinateur ne saurait jamais "un objet existant" sur une autre machine.


0 commentaires