Domanda

Si è verificato un errore "Spazio esaurito" durante il tentativo di serializzare un oggetto array AJAX ASP.Net.

Ecco lo scenario con codice semplificato:

  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
    }
    

Il codice per le pagine di esempio e JavaScript è Qui.

Pubblicare qui il codice per le pagine aspx ha posto un problema.Quindi controlla il link sopra per vedere il codice per le pagine aspx.

Una pagina Web (default.aspx) con un IFrame che ospita una pagina di contenuto (content.aspx).

Facendo clic sul pulsante "Serializza oggetto" viene richiamata la funzione JavaScript serializeObject().La serializzazione funziona correttamente per gli oggetti Array creati nella finestra in alto (all'esterno del frame).Tuttavia, se l'oggetto array viene creato nell'IFrame, la serializzazione genera un errore di spazio esaurito.Ho esaminato i file ASP.Net AJAX JS e quello che ho scoperto è che il processo entra in un ciclo infinito cercando di capire il tipo dell'oggetto array.Chiamata infinita a Number.IsInstanceOf e molto presto ricevi un errore di stack fuori.

Qualche idea?

È stato utile?

Soluzione

Questo problema si verifica perché Sys.Serialization.JavaScriptSerializer non può serializzare oggetti da altri frame, ma solo quegli oggetti di cui è stata istanziata la finestra corrente (che chiama il metodo serialize()).L'unica soluzione alternativa che conosco è creare un clone dell'oggetto da un altro frame prima di chiamare il metodo serialize().

Esempio del metodo clone() che puoi trovare qui (commenti in russo):testo del collegamento

Altri suggerimenti

Ho convertito il tuo esempio in una serie di file HTML statici e ho scaricato il file standalone Libreria Microsoft Ajax 3.5 con cui provare.Non si sono verificati problemi né su Firefox 3 né su IE 7, ma ho notato che la prima casella di avviso veniva visualizzata [] (un array) e la seconda {} (un oggetto).

Quindi, ho convertito il tuo nuovo codice Array() in:

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

e successivamente ho ottenuto [1] e {"0", 1} sono le caselle di avviso.Non penso che il bug riguardi JavaScriptSerializer, ma qualcosa che ha a che fare con il passaggio di oggetti tra frame.

Non ho modo di testare il tuo codice in questo momento, ma mi sembra un bug in JavaScriptSerializer.serialize.La mia ipotesi è che provi a eseguire una sorta di controllo del tipo sull'array tramite CLR e che non gestisca correttamente un array vuoto.

Hai provato ad aggiungere un elemento di tipo serializzabile all'array nel tuo codice?Se sì, cosa succede?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top