2008-09-11 48 views
1

尝试序列化ASP.Net AJAX Array对象时,出现“Out of Stack Space”错误。ASP.Net AJAX JavaScript序列化错误

这里是简化代码的情形:

  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页面的代码。

带有IFrame的网页(default.aspx)上包含一个内容页面(content.aspx)。

单击“Serialize Object”按钮调用JavaScript函数serializeObject()。序列化对顶部窗口中创建的Array对象(在框架之外)工作良好。但是,如果数组对象是在IFrame中创建的,则序列化炸弹会出现堆栈空间错误。我跨过了ASP.Net AJAX JS文件,我发现的是,该过程进入无尽的循环,试图找出数组对象的类型。无休止地调用Number.IsInstanceOf,很快你会得到一个堆栈错误。

任何想法?

回答

2

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

例METHODE你可以在这里找到(俄文注释): link text

0

我没有办法测试你的代码,但它看起来像JavaScriptSerializer.serialize中的一个bug。我的猜测是它试图通过CLR对数组进行某种类型的检查,并且它不能正确处理空数组。

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

1

我转换你的榜样,以一组静态HTML文件,并dowloaded独立Microsoft Ajax Library 3.5测试用。它在Firefox 3或IE 7上都没有问题,但我注意到第一个警告框显示[](数组)和第二个{}(一个对象)。

然后,我转换您的新阵列()代码:

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

,之后,我得到[1]和{ “0”,1}是警报框。我不认为这个bug是JavaScriptSerializer的问题,而是与跨帧传递对象有关。