Exceção estranha de serialização do GWT ao substituir o método do objeto serializado
-
28-09-2019 - |
Pergunta
Eu tenho uma classe serializável do GWT, vamos chamá-la de Foo.Foo implementa IsSerializable, possui membros primitivos e serializáveis, bem como outros membros transitórios e um construtor sem argumento.
class Foo implements IsSerializable {
// transient members
// primitive members
public Foo() {}
public void bar() {}
}
Também é um serviço que usa a instância Foo na comunicação RPC.
// server code
public interface MyServiceImpl {
public void doStuff(Foo foo);
}
public interface MyServiceAsync {
void doStuff(Foo foo, AsyncCallback<Void> async);
}
Como eu uso isso:
private MyServiceAsync myService = GWT.create(MyService.class);
Foo foo = new Foo();
...
AsyncCallback callback = new new AsyncCallback {...};
myService.doStuff(foo, callback);
No caso acima, o código está em execução e o método onSuccess() da instância de retorno de chamada é executado.
Mas quando eu substituo o método bar() na instância foo assim:
Foo foo = new Foo() {
public void bar() {
//do smthng different
}
};
AsyncCallback callback = new new AsyncCallback {...};
myService.doStuff(foo, callback);
Eu recebo a SerializationException do GWT.
Por favor, me esclareça, porque eu realmente não entendo o porquê.
Solução
Acho que o problema vem da política de serialização rpc, que cria uma "lista branca" de tipos serializáveis para o serviço rpc.
No seu caso, a classe "Foo" está na lista de permissões, mas quando você substitui um método, você cria uma classe anônima que estende Foo, mas não está na lista de permissões, então o GWT se recusa a serializá-lo...e não vejo como fazer o que você deseja sem criar uma subclasse explícita...