1

私は GWT のシリアライズ可能なクラスを持っています。これを Foo と呼びましょう。Foo は IsSerializable を実装し、プリミティブおよびシリアライズ可能なメンバー、その他の一時的なメンバー、および引数なしのコンストラクターを持ちます。

class Foo implements IsSerializable {
 // transient members
 // primitive members
  public Foo() {}
  public void bar() {}
}

また、RPC 通信で Foo インスタンスを使用するサービス。

// server code
public interface MyServiceImpl {
  public void doStuff(Foo foo);
}

public interface MyServiceAsync {
       void doStuff(Foo foo, AsyncCallback<Void> async);
}

これを使用する方法:

private MyServiceAsync myService = GWT.create(MyService.class);
Foo foo = new Foo();
...
AsyncCallback callback = new new AsyncCallback {...};
myService.doStuff(foo, callback);

上記の場合、コードは実行中で、コールバック インスタンスの onSuccess() メソッドが実行されます。

しかし、次のように foo インスタンスで bar() メソッドをオーバーライドすると:

Foo foo = new Foo() {
public void bar() {
 //do smthng different
}
};
 AsyncCallback callback = new new AsyncCallback {...};
 myService.doStuff(foo, callback);

GWT SerializationException が発生します。

原因がよくわからないので教えてください。

4

1 に答える 1

1

問題は、rpc サービスのシリアライズ可能な型の「ホワイト リスト」を作成する rpc シリアライゼーション ポリシーにあると思います。

あなたの場合、「Foo」クラスはホワイトリストにありますが、メソッドをオーバーライドすると、Foo を拡張するがホワイトリストにない匿名クラスを作成するため、GWT はそれをシリアル化することを拒否します...そして、私はそれを行う方法がわかりません明示的なサブクラスを作成せずに必要なもの...

于 2010-09-01T15:19:34.017 に答える