Произошла ошибка «Out of Stack Space» при попытке сериализовать объект массива ASP.Net AJAX.
Вот сценарий с упрощенным кодом:
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
}
Код для примеров страниц и JavaScript - здесь.
Размещение кода для страниц aspx здесь создало проблему. Поэтому, пожалуйста, проверьте приведенную выше ссылку, чтобы увидеть код для страниц aspx.
Веб-страница (default.aspx) с IFrame, на которой размещается страница содержимого (content.aspx).
Нажатие кнопки «Сериализовать объект» вызывает функцию JavaScript serializeObject (). Сериализация отлично работает для объектов Array, созданных в верхнем окне (за пределами фрейма). Однако, если объект массива создается в IFrame, сериализация срывается с ошибкой вне стека. Я прошел через файлы ASP.Net AJAX JS и обнаружил, что процесс заходит в бесконечный цикл, пытаясь определить тип объекта массива. Бесконечный вызов Number.IsInstanceOf, и довольно скоро вы получите ошибку вне стека.
Есть идеи?





У меня нет возможности протестировать ваш код прямо сейчас, но мне кажется, что это ошибка в JavaScriptSerializer.serialize. Я предполагаю, что он пытается выполнить какую-то проверку типа в массиве через CLR и что он не обрабатывает пустой массив должным образом.
Вы пытались добавить элемент сериализуемого типа в массив в своем коде? Если да, то что происходит?
Я преобразовал ваш пример в набор статических html-файлов и загрузил автономный Библиотека Microsoft Ajax 3.5 для тестирования. У него не было проблем ни в Firefox 3, ни в IE 7, но я заметил, что первое окно предупреждения отображается [] (массив), а второе {} (объект).
Затем я преобразовал ваш новый код Array () в:
var obj = [];
obj.push(1);
и после этого я получил [1] и {"0", 1} - это окна предупреждений. Я не думаю, что ошибка связана с JavaScriptSerializer, но что-то связано с передачей объектов между фреймами.
Эта проблема возникает из-за того, что Sys.Serialization.JavaScriptSerializer не может сериализовать объекты из других фреймов, а только те объекты, которые были созданы в текущем окне (которое вызывает метод serialize ()). Единственный известный мне обходной путь - это клонирование объекта из другого фрейма перед вызовом метода serialize ().
Пример метода clone () вы можете найти здесь (комментарии на русском языке): текст ссылки