2012-12-19 27 views
7

Chúng tôi đang gặp lỗi SerializationException khi gửi danh sách các đối tượng sử dụng RPC và Java Generics.GWT và Generics

tôi là tạo widget này để hiển thị các lỗi:

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(); 

    } 

} 

Đây là mã để tạo widget Test và đi qua một danh sách các POJO (nơi ExporterFormKey là đối tượng 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); 

Vào cuối mã tiếp theo ném một SerializationException:

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

trong khi tiếp theo một trong những hiện tốt:

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

----- Sửa ----

tôi thấy rằng làm mã tiếp theo cũng làm việc

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

Hoặc này cũng làm việc

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

Tôi cũng tìm thấy thay đổi này đối với công việc Kiểm tra!

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

Bạn có thể phải dùng thử test.getList() để nhập Danh sách hoặc Khai báo Kiểm tra bằng . – SSR

+1

Có lẽ ListDataProvider của bạn () không trả về một ArrayList nhưng thực hiện Danh sách khác (ví dụ một danh sách trả về Collections.unmodifiableList() hoặc một kiểu dẫn xuất AbstractList. Bạn có thể đăng toàn bộ SerializationException và nhật ký máy chủ không? serialization bị lỗi và đó là lớp vi phạm – izaera

Trả lời

1

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

Như izaera đề nghị ListDataProvider sử dụng một thực hiện danh sách không serializable (ListWrapper) mà không thể được gửi trực tiếp qua dây dẫn.

Đưa phản hồi từ phương thức getList() của ListDataProvider vào một ArrayList mới như bạn đã đề xuất trong bài đăng của mình là cách đơn giản nhất để khắc phục sự cố.

+0

Trong trường hợp ai đó đang truy cập vào đây để có câu trả lời, liên kết ở trên hiện đã chết và trả về 404. Trang cũng dường như không được lưu vào bộ nhớ cache. – JRSofty