ASP.Net AJAX JavaScript Ошибка сериализации - PullRequest
1 голос
/ 11 сентября 2008

Произошла ошибка «Out of Stack Space» при попытке сериализации объекта массива ASP.Net AJAX.

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

  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: здесь .

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

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

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

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 01 апреля 2010

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

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

1 голос
/ 11 октября 2008

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

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

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

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

0 голосов
/ 11 сентября 2008

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

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

...