2012-02-21 8 views
2

누군가 GWT에서 AutoBeanFactory (예 : GWT (Client) = How to convert Object to JSON and send to Server?)를 사용하는 것과 같은 농구를 뛰어 넘지 않고 JSON 객체로 클라이언트/공유 pojo (JSF 객체를 구현)를 변환 할 수없는 이유를 설명 할 수 있습니까? 자바 스크립트 오버레이 객체 만들기 (JavaScriptObject 확장)gwt 공유 객체를 json으로 변환

GWT는 클라이언트 객체를 javascript 객체로 컴파일하므로 요청할 때 자바 스크립트를 JSON으로 간단하게 변환 할 수없는 이유는 무엇입니까?

에만 제공되는 GWT JSON 라이브러리이 작업은 JSON.stringify을 내가 분명히 GWT 이후 GWT에 대해 뭔가 오해하고

는 자바 스크립트 객체로 간단한 자바 POJO를 컴파일하고 자바 스크립트로 할 수 JavaScriptObject

확장 JSONify 자바 객체로 할 수 있습니다 그것을 JSON에 넣으십시오. 왜 GWT에 없습니까?

답변

2

GWT는 앱을 컴파일하며 변환하지 않습니다. 그것은 일반적으로 클래스 계층 구조 (그리고 당신이 사용하는 GWT 클래스) 다음, 필요로 클래스를 구축하는 자바 스크립트의 prototype 오브젝트를 활용 않지만, 다른 많은 변화한다 :

최적화 :

  • 을 유형을 조입니다 - 뭔가를 List이라고 말하면서 만 ArrayList 일 수 있습니다. 유형 선언을 다시 작성합니다. 이것은 그다지 효과적이지 않지만 다른 단계를 더 잘 수행 할 수 있습니다.
  • 정적 메소드 만들기 - ArrayList.add를 오버라이드하지 않으면, 예를 들어 ArrayList.add에있는 모든 호출이 바뀝니다. 정적 호출, 다이나믹 디스패치의 필요성을 방지하며, 최종 JS에서 'this'문자열이 더 짧은 arg 이름으로 대체되도록 허용합니다. 이렇게하면 JS 객체가 예상하는 메소드를 가질 수 없게됩니다.
  • 인라인 메서드 - 메서드가 간단하고 충분한 장소에서 호출되는 경우 컴파일러는 메서드가 완전히 호출 된 곳을 모두 알고 있으므로 메서드를 완전히 제거 할 수 있습니다. 이것은 유스 케이스에 직접적인 영향을 미친다.
  • 참조되지 않은 필드 제거/인라인 - 필드를 읽지 만 한 번만 쓰면 원래 값이 상수라고 가정합니다. 읽을 수 없다면 할당 할 이유가 없습니다. 컴파일러가 말할 수없는 값은 브라우저에서 js와 ​​시간의 공간을 사용할 필요가 없습니다. 이것은 또한 gwt'd Java를 JS로 취급하는 데 직접적인 영향을줍니다.

다음으로 컴파일러는 필드, 인수 및 형식의 이름을 가능한 한 작게 변경합니다. 필드 또는 인수가 가장 자주 사용되기 때문에 필드 또는 인수가 1 문자를 초과하는 경우는 거의 없습니다. 사용되며 가장 작은 범위를 가지므로 컴파일러가 가장 자주 재사용 할 수 있습니다. 이것 역시 JSON으로 객체를 처리하는 데 영향을 미칩니다.

GWT 개체를 JSON으로 내보낼 수있는 라이브러리는 다른 가정을 통해 그렇게 할 수 있습니다. 컴파일러 예정대로 할 수없는, 당신이 쓰는 JSNI가 상대적으로 최적화되지 않은 나타날 것입니다 -

  • JavaScriptObject (JSO)은 실제 자바 객체가 아니라 당신이 마음대로왔다 갔다 캐스트 할 수 있도록 실제로 자바 스크립트 인스턴스를 나타냅니다 외부 라이브러리와 대화하고 있는지 확인하십시오.
  • AutoBeans는 JSON을 기록 할 수 있어야하므로 개체를 인코딩하는 특정 메서드가 기록됩니다.컴파일 된 다른 Java와 동일한 규칙이 적용됩니다. 사용되지 않는 코드는 제거 될 수 있으며, 한 방향으로 만 호출되는 코드는 강화되거나 인라인 될 수 있습니다.
  • JS를 Java 세부 정보로 컴파일하여 최종 실행 파일로 내보낼 수있는 라이브러리는 크기가 커지지 만 제한된 방식으로 JS와 같은 Java 개체를 처리 할 수 ​​있습니다.

마지막으로 요점은 JSON과 자바 스크립트에 대해 이야기하고 있기 때문입니다. 일부 일반 JS는 JSON으로 쓰는 데 적합하지 않습니다. Date 객체에는 JSON에서 인식하는 일관된 직렬화 방법이 없습니다. 비 트리 개체 그래프를 직렬화 할 수 없습니다

var obj = {}; 
obj.prop = {}; 
obj.prop.obj = obj; 

Autobeans는이 순환 참조에 대한 검사에 내장 된 와서 나는 JSO 직렬화뿐만 아니라 않는 희망.

+0

감사합니다. 지금 완벽하게 이해합니다. – paul

관련 문제