참조: http://code.google.com/intl/ko-KR/webtoolkit/doc/latest/DevGuideServerCommunication.html#DevGuideSerializableTypes

GWT에서 RPC를 할 때 메서드로 넘기는 매개변수나 메서드의 리턴값에 직렬화 개념을 적용합니다. 이때 GWT의 직렬화랑 자바의 직렬화가 약간 다르기 때문에 GWT에서 제공하는 마커 인터페이스인 IsSerializable을 사용할 수 있고 기본으로 직렬화 되는 타입도 있습니다.

직렬화 가능한 타입

  • 기본타입: char, byte, short, int, long, double, float, boolean...
  • String, Date, 기본타입의 래퍼 클래스(Character, Byte, Short, Integer, ...)
  • enum: 필드 값들은 직렬화 하지 않고 enum 이름만.
  • 직렬화 가능한 타입의 배열
  • 직렬화 가능한 사용자 정의 클래스
  • 직렬화 가능한 하위 타입을 하나라도 가지고 있는 타입

java.lang.Object는 직렬화 가능한 타입이 아니기 때문에 Object의 콜렉션은 직렬화되지 않는다.

직렬화 가능한 사용자 정의 클래스

다음 세가지 조건을 모두 만족해야 한다.

  • IsSerializable 또는 Serializable 인터페이스 구현.
  • final transient가 아닌 모든 필드가 직렬화 가능해야 함.
  • GWT 1.5부터는 기본 생성자를 가지고 있거나 생성자가 하나도 없는 클래스.

transient 키워드는 원래 직렬화에서 제외할 용도로 만들어진 것이고, final로 선언한 필드도 직렬화가 되지 않기 때문에 transient를 붙여주는게 좋다.

다형성

지원함.

로우타입

콜렉션을 직렬화 하려면 제네릭을 사용해서 타입을 명시해야 함.

조작 클래스 직렬화

서버쪽에서 Enhanced 클래스(조작 클래스)를 사용하면 바이트코드나 클래스 소스 코드에 부가적인 코드를 집어넣거나 기존 코드를 변경하기 때문에 클라이언트 코드와 서버쪽 코드가 달라져서 GWT 이전 버전에서는 RPC 할때 직렬화 할 수 없었다.

그러나 GWT 2.0 부터는 다음과 같은 클래스들은 직렬화 할 수 있다.

  • JDO 애노테이션을 붙인 클래스: detachable=true 속성을 가지고 있는 PersistenceCapable 애노테이션
  • JPA 애노테이션을 붙인 클래스: Entity
  • .gwt.xml에 rpc.enhancedClasses에 설정한 클래스

영속성 구현체 사용시 주의할 것

  • RemoteService에 전달하거나 거기서 반환하는 객체는 반드시 Detached 상태여야 한다.
  • 조작된 필드가 final이나 transient가 아니라면 자바 직렬화가 가능한 필드여야 한다.
  • 부가작용이 있는 필드를 변경하려면 그 필드에 해당하는 세터가 있어야 한다.

서버에서 클라이언트로 보낼 때는 일반적인 GWT RPC가 적용된다. 즉 서버에서 조작된 필드가 추가로 클라이언트에 전달 된다.

클라이언트에서 서버로 넘어올 땐 인코딩해서 넘기고 서버쪽에서 세터로 디코딩해서 넣는다.

ps: 아흑. 도무지 아래 세문장은 잘 이해가 안되넹;; 어쨌거나 결국은 JPA 사용한 클래스도 RPC에서 직렬화 된다는거 아닌가;