2008-09-11 7 views
1

Ran dans une erreur "Out of Stack Space" en essayant de sérialiser un objet ASP.Net AJAX Array.Erreur de sérialisation JavaScript ASP.Net AJAX

Voici le scénario avec le code simplifié:

  1. Default.aspx

  2. MainScript.js

    function getObject(){ 
        return new Array(); 
    } 
    
    function function1(obj){ 
        var s=Sys.Serialization.JavaScriptSerializer.serialize(obj); 
        alert(s); 
    } 
    
    function function2(){ 
        var obj=getObject(); 
        var s=Sys.Serialization.JavaScriptSerializer.serialize(obj); 
        alert(s); 
    } 
    
  3. Content.aspx

  4. ContentScript.js

    function serializeObject(){ 
        var obj=window.top.getObject(); 
        window.top.function1(obj); // <– This works fine 
    
        obj=new Array(); 
        window.top.function1(obj); // <– this causes an Out of Stack Space error 
    } 
    

Le code pour les pages échantillon et JavaScript est here. L'affichage du code pour les pages aspx ici posait un problème. Donc s'il vous plaît vérifier le lien ci-dessus pour voir le code pour les pages aspx.

Une page Web (default.aspx) avec un IFrame sur lequel héberge une page de contenu (content.aspx).

Cliquer sur le bouton "Serialize Object" appelle la fonction JavaScript serializeObject(). La sérialisation fonctionne correctement pour les objets Array créés dans la fenêtre supérieure (en dehors du cadre). Toutefois, si l'objet tableau est créé dans le cadre IFrame, les bombardements de sérialisation avec une erreur d'espace hors pile. J'ai traversé les fichiers ASP.Net AJAX JS et ce que j'ai découvert, c'est que le processus va dans une boucle sans fin essayant de comprendre le type de l'objet tableau. Appel sans fin à Number.IsInstanceOf et très bientôt vous obtenez une erreur de pile.

Des idées?

Répondre

2

Ce problème se produit car Sys.Serialization.JavaScriptSerializer ne peut pas sérialiser des objets à partir d'autres cadres, mais uniquement ceux qui ont été instanciés dans la fenêtre en cours (qui appelle la méthode serialize()). La seule solution de contournement connue pour moi consiste à créer un clone de l'objet à partir d'un autre cadre avant d'appeler la méthode serialize().

Exemple du clone() Methode vous pouvez trouver ici (commentaires en russe): link text

0

Je n'ai aucun moyen de tester votre code pour le moment, mais cela ressemble à un bug dans JavaScriptSerializer.serialize pour moi. Ma conjecture est qu'il essaye de faire une sorte de contrôle de type sur le tableau via le CLR et qu'il ne gère pas un tableau vide correctement.

Avez-vous essayé d'ajouter un élément d'un type sérialisable à la matrice dans votre code? Si oui, que se passe-t-il?

1

J'ai converti votre exemple en un ensemble de fichiers html statiques, et j'ai téléchargé le fichier autonome Microsoft Ajax Library 3.5 pour le tester. Il n'a pas eu de problème sur Firefox 3 ou IE 7, mais j'ai remarqué la première boîte d'alerte affichée [] (un tableau) et la seconde {} (un objet).

Puis, je me suis converti votre nouveau Array() code:

var obj = []; 
    obj.push(1); 

et après cela, je suis [1] et { "0", 1} est les cases d'alerte. Je ne pense pas que le bug est avec JavaScriptSerializer, mais quelque chose à faire avec le passage d'objets à travers les cadres.

Questions connexes