Pergunta

Encontrei um erro “Out of Stack Space” ao tentar serializar um objeto ASP.Net AJAX Array.

Aqui está o cenário com código simplificado:

  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
    }
    

O código para as páginas de amostra e JavaScript é aqui.

Publicar o código das páginas aspx aqui representou um problema.Portanto, verifique o link acima para ver o código das páginas aspx.

Uma página da web (default.aspx) com um IFrame que hospeda uma página de conteúdo (content.aspx).

Clicar no botão “Serialize Object” chama a função JavaScript serializeObject().A serialização funciona bem para objetos Array criados na janela superior (fora do quadro).No entanto, se o objeto de matriz for criado no IFrame, a serialização falhará com um erro de falta de espaço na pilha.Examinei os arquivos ASP.Net AJAX JS e o que descobri é que o processo entra em um loop infinito tentando descobrir o tipo do objeto array.Chamada infinita para Number.IsInstanceOf e logo você receberá um erro de falta de pilha.

Alguma ideia?

Foi útil?

Solução

Este problema ocorre porque Sys.Serialization.JavaScriptSerializer não pode serializar objetos de outros frames, mas apenas aqueles objetos que foram instanciados na janela atual (que chama o método serialize()).A única solução alternativa que conheço é clonar o objeto de outro quadro antes de chamar o método serialize().

Exemplo do método clone() você pode encontrar aqui (comentários em russo):Texto do link

Outras dicas

Converti seu exemplo em um conjunto de arquivos HTML estáticos e baixei o arquivo independente Biblioteca Microsoft Ajax 3.5 para testar.Não houve problema no Firefox 3 ou no IE 7, mas notei a primeira caixa de alerta exibida [] (uma matriz) e a segunda {} (um objeto).

Então, converti seu novo código Array() para:

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

e depois disso, obtive [1] e {"0", 1} são as caixas de alerta.Não acho que o bug esteja no JavaScriptSerializer, mas em algo relacionado à passagem de objetos entre frames.

Não tenho como testar seu código agora, mas parece um bug em JavaScriptSerializer.serialize para mim.Meu palpite é que ele tenta fazer algum tipo de verificação de tipo no array por meio do CLR e não lida corretamente com um array vazio.

Você tentou adicionar um item de tipo serializável ao array em seu código?Se sim, o que acontece?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top