7

使用 RPC 和 Java 泛型发送对象列表时出现 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();

    }

}

这是用于创建 Test 小部件并传递 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 回答