ASP.Net AJAX JavaScript序列化错误

时间:2020-03-05 18:51:35  来源:igfitidea点击:

遇到"堆栈空间不足"错误,尝试序列化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页面的代码。

带有IFrame的网页(default.aspx)托管内容页面(content.aspx)。

单击"序列化对象"按钮将调用JavaScript函数serializeObject()。对于在顶部窗口(框架外部)中创建的Array对象,序列化工作正常。但是,如果在IFrame中创建数组对象,则序列化炸弹会出现堆栈空间不足错误。我逐步浏览了ASP.Net AJAX JS文件,发现的是,该过程陷入无尽的循环,试图找出数组对象的类型。无休止地调用Number.IsInstanceOf,很快我们就会收到栈外错误。

有任何想法吗?

解决方案

回答

我目前无法测试代码,但是对我来说,它看起来像是JavaScriptSerializer.serialize中的错误。我的猜测是,它尝试通过CLR对数组进行某种类型检查,并且不能正确处理空数组。

我们是否尝试过将可序列化类型的项添加到代码中的数组?如果是这样,会发生什么?

回答

我将示例转换为一组静态html文件,并下载了独立的Microsoft Ajax Library 3.5进行测试。在Firefox 3或者IE 7上都没有问题,但是我确实注意到第一个警告框显示为,第二个警告框为{}(对象)。

然后,我将新Array()代码转换为:

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

然后,我得到了[1]和{" 0",1}是警报框。我认为该错误与JavaScriptSerializer无关,但与跨帧传递对象有关。

回答

发生此问题的原因是Sys.Serialization.JavaScriptSerializer无法序列化其他框架中的对象,而只能序列化在当前窗口中实例化的那些对象(调用serialize()方法)。对我而言,唯一已知的解决方法是在调用serialize()方法之前从其他框架克隆对象。

我们可以在此处找到clone()方法的示例(俄语注释):
连结文字