7

RPC および Java Generics を使用してオブジェクトのリストを送信すると、SerializationException エラーが発生します。

エラーを表示するためにこのウィジェットを作成しています:

public class Test<T> {

    ListDataProvider<T> ldp = new ListDataProvider<T>();

    public void setItems(List<T> list){
        for(T t :list){
            ldp.getList().add(t);
        }
    }

    public List<T> getItems(){
        return ldp.getList();

    }

}

これは、テスト ウィジェットを作成し、POJO のリストを渡すためのコードです (ExporterFormKey は POJO オブジェクトです)。

List<ExporterFormKey> list = new ArrayList<ExporterFormKey>();
ExporterFormKey key = new ExporterFormKey();
key.setKey("key1");
list.add(key);

Test<ExporterFormKey> test = new Test<ExporterFormKey>();
test.setItems(list);

最後に、次のコードは SerializationException をスローします。

service.sendList(test.getList(), new AsyncCallback...);

次のものはうまくいきますが:

service.sendList(list, new AsyncCallback...);

- - -編集 - -

次のコードを実行しても機能することがわかりました

List<ExporterFormKey> newList = new ArrayList<ExporterFormKey>();
newList.add(test.getItems().get(0));
service.sendList(newList , new AsyncCallback...);

または、これも機能します

List<ExporterFormKey> newList = new ArrayList<ExporterFormKey>(test.getItems());

テスト作品でもこの変更を見つけました!

public List<T> getItems(){
    return new ArrayList<T>(ldp.getList());
}
4

1 に答える 1

1

http://blog.rubiconred.com/2011/04/gwt-serializationexception-on-rpc-call.html

izaeraが提案したように、ListDataProviderは、シリアル化できないリスト実装(ListWrapper)を使用します。これは、ネットワークを介して直接送信することはできません。

投稿で提案したように、ListDataProviderのgetList()メソッドからの応答を新しいArrayListにラップするのが、この問題を回避する最も簡単な方法です。

于 2012-12-19T23:47:32.847 に答える