ASP.Net AJAX JavaScript シリアル化エラー
-
09-06-2019 - |
質問
ASP.Net AJAX Array オブジェクトをシリアル化しようとすると、「スタック領域不足」エラーが発生しました。
簡略化されたコードのシナリオは次のとおりです。
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 ページのコードを確認してください。
コンテンツ ページ (content.aspx) をホストする IFrame を含む Web ページ (default.aspx)。
「オブジェクトのシリアル化」ボタンをクリックすると、JavaScript 関数の SerializeObject() が呼び出されます。シリアル化は、上部ウィンドウ (フレームの外側) で作成された Array オブジェクトに対して正常に機能します。ただし、配列オブジェクトが IFrame で作成された場合、シリアル化ではスタック領域不足エラーが発生します。ASP.Net AJAX JS ファイルを詳しく調べてみたところ、プロセスが配列オブジェクトの型を把握しようとして無限ループに入っていることがわかりました。Number.IsInstanceOf への無限呼び出しが発生し、すぐにスタック不足エラーが発生します。
何か案は?
解決
この問題は、Sys.Serialization.JavaScriptSerializer が他のフレームからオブジェクトをシリアル化できず、現在のウィンドウ (serialize() メソッドを呼び出す) でインスタンス化されたオブジェクトのみをシリアル化できるために発生します。私にとって知られている唯一の回避策は、serialize() メソッドを呼び出す前に他のフレームからオブジェクトのクローンを作成することです。
clone() メソッドの例はここにあります (コメントはロシア語):リンクテキスト
他のヒント
あなたの例を一連の静的 HTML ファイルに変換し、スタンドアロン ファイルをダウンロードしました。 Microsoft Ajax ライブラリ 3.5 でテストします。Firefox 3 または IE 7 では問題はありませんでしたが、最初のアラート ボックスには [] (配列) が表示され、2 番目のアラート ボックスには {} (オブジェクト) が表示されていました。
次に、新しい Array() コードを次のように変換しました。
var obj = [];
obj.push(1);
その後、[1] と {"0", 1} がアラート ボックスを取得しました。このバグは JavaScriptSerializer にあるのではなく、フレーム間でオブジェクトを渡すことに関係があると思います。
現時点ではコードをテストする方法がありませんが、JavaScriptSerializer.serialize のバグのように思えます。私の推測では、CLR を介して配列に対して何らかの型チェックを行おうとしており、空の配列を適切に処理できないのではないかと考えられます。
コード内の配列にシリアル化可能な型の項目を追加しようとしましたか?もしそうなら、何が起こりますか?