2010-01-22 3 views
5

이 질문의 반대쪽 : How do I add a type to GWT's Serialization Policy whitelist?GWT의 직렬화 정책에서 구현 유형을 제거하려면 어떻게해야합니까?

GWT는 직렬화 정책에 원하지 않는 유형을 추가하고 JS를 부풀려합니다. 직접 GWT 화이트리스트를 손으로 다듬을 수 있습니까? 아니면 내가해야 하나?

예를 들어 인터페이스 목록을 GWT RPC 서비스 클래스에 추가하면 GWT는 ArrayList, LinkedList, Stack, Vector 등의 자바를 생성해야합니다. ArrayList를 돌려줍니다. 메서드의 반환 형식 ArrayList를 만들 수는 있지만 특정 구현보다는 인터페이스에 의존하는 것이 좋습니다. 어쩌면 언젠가 우리는 그것을 바꾸고 돌아올 것입니다. LinkedList. 이 경우 GWT serialization 정책을 ArrayList 및 LinkedList 만 컴파일하도록하고 싶습니다. 아니 스택이나 벡터.

이러한 암묵적인 제한 사항에는 내가 생각할 수있는 하나의 큰 단점이 있습니다. 팀의 새 구성원이 벡터를 반환하기 시작합니다. 런타임 오류가 발생합니다. 따라서 제목의 질문 외에도이 문제를 해결할 수있는 경험은 무엇입니까?

+0

디자인 목표는 무엇입니까? 보안? 공연? –

+1

성능, 한마디로 : 지금 JS의 크기를 줄이려면. RPC를 통해 Set와 Maps를 보내기 시작하면 또 하나의 클래스 폭발이 일어납니다.다른 목표는 최상의 코딩 방법을 유지하는 것입니다. 내가 볼 수없는 보안 문제가있는 경우 알려 주시기 바랍니다. – Bluu

+0

아주 간단한 해결책이있는 것 같습니다. 분명히 당신은 당신이 그것을 진술 한 것처럼 그것이 무엇인지를 압니다. 왜 GWT를 바꾸려고 노력하는 데 많은 어려움을 겪고 있습니까? 바보 같아. 앞으로 LinkedList를 반환해야한다면 인터페이스로 변경할 수 있습니다. 나는 당신의 디자인 목표가 퍼포먼스라면, 리턴 타입을 ArrayList로 변경하고 그것으로 끝낼 것이라고 생각한다. 내 2 센트. –

답변

7

이 클래스 블랙리스트를 작성할 수있는 속성이 있습니다. 예를 들어, 비 ArrayList의 컬렉션을 블랙리스트에 *를하며 .gwt.xml에 다음 줄을 추가 보낼 때 나를 JS 크기를 줄일 수 있도록

<extend-configuration-property name="rpc.blacklist" value="java.util.HashSet"/> 
<extend-configuration-property name="rpc.blacklist" value="java.util.LinkedHashSet"/> 
<extend-configuration-property name="rpc.blacklist" value="java.util.LinkedList"/> 
<extend-configuration-property name="rpc.blacklist" value="java.util.Stack"/> 
<extend-configuration-property name="rpc.blacklist" value="java.util.TreeMap"/> 
<extend-configuration-property name="rpc.blacklist" value="java.util.TreeSet"/> 
<extend-configuration-property name="rpc.blacklist" value="java.util.Vector"/> 

이 필요했다 GWT에 내장 된 와이어를 통해 com.google.gwt.user.client.ui.SuggestOracle$Response 객체. 이러한 객체에는 java.util.Collection이 포함되어 있지만 ArrayList 만 되돌려 보낼 것이라는 것을 알고있었습니다.

다른 응답, 주석 및 원래의 질문에서 논의 된 것처럼 컴파일 타임 검사의 장점은 여전히 ​​존중합니다. 실제로, GWT가 일련의 추가 구현을 시작하여 (왜 이것이 화이트리스트가 아닌가?), 희박한 해결책이다. 그러나이 "rpc.blacklist"속성은 더 구체적인 컬렉션 유형을 얻기 위해 내 자신을 굴려서 SuggestOracle을 굴리지 않도록했습니다.

6

그래도 좋은 프레임 워크가 사용자를 변경하려고 시도하지는 않지만 GWT 직렬화가 왜 그렇게 작동하는지 설명하려고합니다. 나는 이것의 정확한 메커니즘을 모른다. 그래서 나는 잘못 될 수있다. 그러나 이것은 내가 본 것의 요지이다.

GWT는 이미 RPC 인터페이스 외부에서 추가 코드를 제거합니다. 예를 들어 RPC없이 앱을 사용하면 목록 및지도와 같은 인터페이스를 마음껏 사용할 수 있습니다. GWT는 자동으로 당신이 실제로 사용하는 구현. 왜? 코드에 액세스 할 수 있기 때문에 실제로 코드의 모든 순열을 검토하고 사용되지 않는 클래스를 제거 할 수 있습니다. 따라서 GWT는 인터페이스가 사용될 때 클래스 폭발을 실제로 생성하지 않습니다.

문제는 전적으로 RPC입니다. RPC 서비스의 요점은 서버가 RPC 인터페이스를 구현해야한다는 것입니다. 즉, 인터페이스에서 메소드가 목록을 반환해야한다고 지시하면 서버는 원하는 목록의 구현을 자유롭게 반환 할 수 있습니다. 그것은 직렬화 될 수 있기 때문에.

문제가 있습니다. GWT는 컴파일 타임이나 미래의 어떤 시점에서 서버가 사용할 인터페이스의 구현을 전혀 알 수 없습니다. 서버 코드는 많은 경우 클라이언트 측 코드와 독립적으로 개발 될 수 있습니다. 따라서 와이어를 통해 List 유형의 객체를 안전하게 수신하는 유일한 방법은 사전에 가능한 모든 구현을 알아야합니다.

관련 문제