Ошибка сериализации ASP.Net AJAX JavaScript
-
09-06-2019 - |
Вопрос
При попытке сериализации объекта массива AJAX ASP.Net возникла ошибка «Недостаточно места в стеке».
Вот сценарий с упрощенным кодом:
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, сериализация завершается с ошибкой нехватки места в стеке.Я просмотрел JS-файлы ASP.Net AJAX и обнаружил, что процесс переходит в бесконечный цикл, пытаясь определить тип объекта массива.Бесконечный вызов Number.IsInstanceOf, и довольно скоро вы получите ошибку отсутствия стека.
Есть идеи?
Решение
Эта проблема возникает из-за того, что Sys.Serialization.JavaScriptSerializer не может сериализовать объекты из других кадров, а только те объекты, экземпляры которых были созданы в текущем окне (который вызывает метод сериализации()).Единственный известный мне обходной путь - это создание клона объекта из другого кадра перед вызовом метода сериализации().
Пример метода clone() вы можете найти здесь (комментарии на русском языке):текст ссылки
Другие советы
Я преобразовал ваш пример в набор статических html-файлов и загрузил автономный файл. Библиотека Microsoft Ajax 3.5 для тестирования.Ни в Firefox 3, ни в IE 7 проблем не было, но я заметил, что в первом окне предупреждения отображается [] (массив), а во втором — {} (объект).
Затем я преобразовал ваш новый код Array() в:
var obj = [];
obj.push(1);
и после этого я получил [1] и {"0", 1} — это поля предупреждений.Я не думаю, что ошибка связана с JavaScriptSerializer, а связана с передачей объектов между кадрами.
У меня сейчас нет возможности протестировать ваш код, но мне кажется, что это ошибка в JavaScriptSerializer.serialize.Я предполагаю, что он пытается выполнить какую-то проверку типа массива через CLR и неправильно обрабатывает пустой массив.
Пробовали ли вы добавить в массив в своем коде элемент сериализуемого типа?Если да, то что происходит?