2013-12-21 3 views
0

Game 개체를 서버에서 GWT의 클라이언트로 보내려고합니다. 이 게임의 목적은 단순히 Player의 목록이 포함되어GWT - 수퍼 클래스로 직렬화

public class Game implements Serializable { 
    private List<Player> players; 
} 

Player는 이름, 남은 수명처럼, 플레이어의 상태를 포함하는 간단한 뽀조는 등

public class Player implements Serializable { 
    private String name; 
    private int numberOfGamesPlayed; 
    private double hp, initialHp; 
} 

그러나 게임을 할 수 또한 CpuPlayer를 포함하는 추가적인 인공 지능 논리를 갖는 Player입니다

public class CpuPlayer extends Player { 
    private PlayerIntelligence intelligence; // Not serializable 
} 

모두 GamePlayer 개체가 내 "공유"패키지에 있으며 서버 및 클라이언트 측에서 사용해야합니다.

그러나 CpuPlayer에는 많은 내부 처리 데이터가 포함되어 있으며 순전히 서버 측입니다. 따라서 GWT serialization 허용 목록에 포함되지 않습니다.

CpuPlayerPlayer으로 클라이언트에 보내려고합니다. 즉, 직렬화 중에 모든 하위 클래스 특수성을 마스킹합니다.

이 접근 방식이 효과적입니까? 그렇게 할 수있는 방법이 있습니까? 나는 커스텀 직렬화를 보았지만, 그렇게하지는 않았다 (모든 필드를 하나씩 순차적으로 직렬화해야 할 것이다). 당신의 도움에 대한

감사합니다,
세바스티앙

답변

1

내가 생각할 수있는 가장 간단한 솔루션을 사용하면 플레이어에 CpuPlayer에서 필요한 모든 것을 복사 Dozer 같은 라이브러리를 사용하는 것입니다. 이것은 전화하기와 같이 간단합니다.

Player player = new DozerBeanMapper().map(cpuPlayer, Player.class); 

(복사에 대한 성능 오버 헤드는 무시할 수 있습니다 (서브 밀리 초)).

다른 접근법은 GWT-RPC 대신 RequestFactory를 사용할 수 있습니다. GWT-RPC는 서버 측 객체의 일부만 클라이언트로 전송하도록 설계되었습니다 (클라이언트와 같이 전체 내부 데이터를 보낼 수없는 경우에 이상적입니다).).

+0

첫 번째 매핑 방식을 사용했습니다. 서비스를 호출하는 방식을 변경하는 것보다 결과를 보내기 전에 필터를 추가하는 것이 훨씬 쉽습니다. –

관련 문제