2008-09-11 2 views
1

Ошибка в ошибке «Вне пространства стека», пытающейся выполнить сериализацию объекта ASP.NET AJAX Array.Ошибка ASP.NET AJAX JavaScript Serialization

Вот сценарий с упрощенным кодом:

  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 
    } 
    

Код для страниц образцов и JavaScript является here.

Публикация кода для страниц aspx здесь представляла проблему. Поэтому, пожалуйста, проверьте приведенную выше ссылку, чтобы увидеть код для страниц aspx.

Веб-страница (default.aspx) с IFrame, на которой размещена страница контента (content.aspx).

Нажатие кнопки «Сериализовать объект» вызывает функцию JavaScript serializeObject(). Сериализация прекрасно работает для объектов Array, созданных в верхнем окне (вне рамки). Однако, если объект массива создается в IFrame, серийные бомбы с ошибкой пространства стека. Я прошел через ASP.Net AJAX JS-файлы, и я обнаружил, что этот процесс переходит в бесконечный цикл, пытаясь выяснить тип объекта массива. Бесконечный вызов Number.IsInstanceOf и довольно скоро вы получите ошибку в стеке.

Любые идеи?

ответ

2

Эта проблема возникает из-за того, что Sys.Serialization.JavaScriptSerializer не может сериализовать объекты из других фреймов, а только те объекты, которые создаются в текущем окне (который вызывает метод serialize()). Единственное обходное решение, которое, как мне известно, делает клонирование объекта из другого кадра до вызова метода serialize().

Пример клона() Methode вы можете найти здесь (комментарии на русском): link text

0

У меня нет способа проверить ваш код прямо сейчас, но это похоже на ошибку в JavaScriptSerializer.serialize для меня. Я предполагаю, что он пытается выполнить некоторую проверку типов в массиве через CLR и что он не обрабатывает пустой массив должным образом.

Вы пытались добавить элемент сериализуемого типа в массив в вашем коде? Если да, то что происходит?

1

Я преобразовал ваш пример в набор статических html-файлов и загрузил автономный Microsoft Ajax Library 3.5 для тестирования. У него не было проблем ни на Firefox 3, ни на IE 7, но я заметил, что появилось первое поле предупреждения [] (массив) и второе {} (объект).

Затем я преобразовал свой новый Array() код:

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

и после этого, я получил [1] и { "0", 1} является коробки оповещения. Я не думаю, что ошибка связана с JavaScriptSerializer, но что-то связано с передачей объектов через фреймы.