2010-07-15 5 views
0

:JavaScriptSerializer가 JScript.NET에서 호출 될 때 잘못된 대답을 반환하는 이유는 무엇입니까? ASP.NET/C#에서

<%@ Page Language="C#" %> 
<%@ Import Namespace="System.Web.Script.Serialization" %> 
<% 
JavaScriptSerializer jss = new JavaScriptSerializer(); 
string[] fruits = new string[3] {"apple","banana","crunchberries"}; 
string output = jss.Serialize(fruits); 
%> 
<html> 
fruits=<%=output%> 
</html> 

반환 fruits=["apple","banana","crunchberries"] ASP.NET/VB.NET에서

:

<%@ Page Language="VB" %> 
<%@ Import Namespace="System.Web.Script.Serialization" %> 
<% 
dim jss as new JavaScriptSerializer() 
dim fruits = new String(2) {"apple","banana","crunchberries"} 
dim output as string = jss.Serialize(fruits) 
%> 
<html> 
fruits=<%=output%> 
</html> 

반환 fruits=["apple","banana","crunchberries"]

그러나 ASP.NET/에서 JScript.NET :

<%@ Page Language="JScript" %> 
<%@ Import Namespace="System.Web.Script.Serialization" %> 
<% 
var jss:JavaScriptSerializer = new JavaScriptSerializer; 
var fruits = ["apple","banana","crunchberries"]; 
var output = jss.Serialize(fruits); 
%> 
<html> 
fruits=<%=output%> 
</html> 

반환 fruits=["0","1","2"]

이것은 완전히 깨진 것 같습니다. 유형이를 얻을 필수입니다 왜 표시되지 않습니다

<%@ Page Language="JScript" %> 
<%@ Import Namespace="System.Web.Script.Serialization" %> 
<% 
var jss:JavaScriptSerializer = new JavaScriptSerializer; 
var fruits:String = ["apple","banana","crunchberries"]; 
var output = jss.Serialize(fruits); 
%> 
<html> 
fruits=<%=output%> 
</html> 

반환 fruits=["apple","banana","crunchberries"]

: 그것은 명시 적으로 "기본 배열"에이를 구성하는 데이터 과일의 종류, 을 선언하여 고정 할 수 있습니다 올바른 직렬화. (var fruits = ["apple","banana","crunchberries",5]은 나쁜 코드 일 수 있지만 Javascript와 Jscript에서 모두 합법입니다.) JScript 배열은 기본 배열보다 느리다고 생각되지만 여전히 작동하고 있다고 생각합니까?

답변

0

JavaScriptSerializer를 비난했지만이 문제는 JScript에 "JScript"데이터 형식과 ".NET Framework"데이터 형식의 차이가있는 개인 특성 장애와 관련이있는 것으로 보입니다.

먼저 JavaScriptSerializer의 예외가 적용됩니다. 이 VB 예에 나타낸 바와 같이이 배열 혼합 데이터 타입을 처리 할 수는

dim a as string = "apple" 
dim b as int32 = 5 
dim c as double = 22.22222 
dim fruits(2) as Object 
fruits(0) = a 
fruits(1) = b 
fruits(2) = c 
dim output as string = jss.Serialize(fruits) 

["apple",5,22.22222]를 반환 정확하다.

var a:String="apple"; 
var b:Int32=5; 
var c:Double=22.2; 
var fruits:Object = new Object[3]; 
fruits[0]=a; 
fruits[1]=b; 
fruits[2]=c; 
var output = jss.Serialize(fruits); 

을하지만 아무도 그런 식으로 자바 스크립트를 작성하지 :의 JScript에 (프레임 워크 객체의 길이 3 배열의 스칼라와 인스턴스에 대한 명시 적 타입 선언 완료)이 코드의 포트는 정답을 제공합니다.

var fruits = new Array(); 
fruits.push("apple"); 
fruits.push(5); 
fruits.push(22.22222); 

의 JScript "의 expando"배열 개체를 사용 : 대신 사용하여 유연 형 스택을 쓸 것입니다. JScript 컨텍스트에서 머물러있는 한 괜찮습니다. 프레임 워크에서 아무 것도 호출하면 문제가 생길 수 있습니다.

여기 핵심 문제는 JScript 개체가 Framework (CLR) 배열과 개체로 필요에 따라 변환하지 못하는 것입니다. JScript 10.0 Array Object 토론에서 이에 대해 일종의 경고가 있습니다. ("결과적으로 매개 변수에 타입 주석을 붙이고 CLS 호환 메소드의 반환 유형을 사용할 때는 Array 객체 대신 System.Array 데이터 유형을 사용해야합니다.") 와우, JScript 컴파일러가 나를 찾고있어 기쁩니다.

여기 JScript.NET에 대해 좋은 말을하기가 어렵습니다. 두 가지 미묘하게 다른 종류의 환경이 필요하다고 생각하는 것 같습니다. 배열 및 두 개의 미묘하게 다른 종류의 개체가 있습니다. 이상하게도 Visual C# 2010에서는 the new "DLR" runtime에서 실행할 수있는 "동적"형식과 Expando 개체가 새로 추가되었으므로 이제 JScript의 기발한 버전이 될 수 있습니다.

1

형식 유추 문제처럼 보입니다. 즉, 아마도 JScript.NET이 ["apple","banana","crunchberries"]을 int 배열로 해석했을 것입니다.

object 및 그 대신에 JavaScriptSerializer.Serialize을 사용하는 함수를 만들 수 있습니다. 전달되는 값이 무엇인지 확인하십시오.

+0

그래, 그렇지만 일종의 데이터 형식 검사를 처리하는 것은 serializer의 작업이라고 생각합니다. 잠시 후 serializer가 정상적으로 보이지만 JScript에서 제대로 정의되지 않은 개체를 보내고있는 것처럼 보입니다. –

관련 문제