Errore di serializzazione JavaScript ASP.Net AJAX
-
09-06-2019 - |
Domanda
Si è verificato un errore "Spazio esaurito" durante il tentativo di serializzare un oggetto array AJAX ASP.Net.
Ecco lo scenario con codice semplificato:
Default.aspx
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); }
Content.aspx
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?
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?