2011-03-06 75 views
28

在我的谷歌Web工具包項目,我得到了以下錯誤:SerializationException:類型不包含在序列化的類型設置

com.google.gwt.user.client.rpc.SerializationException:類型「your.class.Type '未包含在可由此SerializationPolicy序列化的類型集中,或者其Class對象無法加載。爲了安全起見,這種類型不會被序列化。

這個錯誤的可能原因是什麼?

+0

這意味着,異步調用的返回類型不是序列化。要對此進行排序,請在返回類型類中實現java.io.seriablizable接口。 – Ashok 2011-08-16 05:04:09

回答

66

GWT跟蹤一系列可以序列化併發送到客戶端的類型。 your.class.Type顯然不在此列表中。像這樣的列表存儲在.gwt.rpc文件中。這些列表已生成,因此編輯這些列表可能沒有用處。如何生成這些名單是有點不清楚,但你可以嘗試以下操作:

  • 確保your.class.Type實現java.io.Serializable
  • 確保your.class.Type有一個公共無參數的構造
  • 確保成員的your.class.Type也這樣做

  • 檢查你的程序是否不包含非序列化類型的集合,例如ArrayList<Object>。如果這樣的集合包含your.class.Type並被序列化,則會發生此錯誤。

  • 製作your.class.Type實施IsSerializable。這個標記接口專門用於應該發送給客戶端的類。這對我不起作用,但我的班級也實施了Serializable,所以也許兩個界面在一起工作不好。

  • 另一種選擇是創建一個虛擬類,其中your.class.Type作爲成員,並向您的RPC接口添加一個獲取並返回虛擬對象的方法。這迫使GWT編譯器將虛擬類及其成員添加到序列化白名單。

+1

太棒了!我沒有添加默認構造函數......不知道序列化類型的構造函數的用途......但我的老闆在修復它之後向我解釋了它...... - 再次感謝:) – 2013-09-30 10:31:07

+0

你是一個生活救星.. 剛剛得到了一些鏈接http://isolaso​​ftware.it/2011/03/22/gwt-serialization-policy-error/ – 2015-02-06 10:15:13

+0

更多的信息構造函數解決了我的問題:) – nikoo28 2015-03-03 14:55:32

4

我還會補充一點,如果你想使用嵌套類,請使用靜態成員類。 即,

public class Pojo { 
    public static class Insider { 
    } 
} 

非靜態成員類得到SerializationException在GWT 2.4

+0

將課程移到外面是另一種選擇。 – drone6502 2017-11-27 20:34:56

3

我有同樣的問題在RemoteService這樣

public List<X> getX(...); 

,其中X是一個接口。唯一的實現符合規則,即實現Serializable或IsSerializable,具有默認構造函數,並且其所有(非瞬態和非最終)字段也遵循這些規則。

但我一直得到SerializationException,直到我改變了結果類型的列表,以X [],所以

public X[] getX(...); 

工作。有趣的是,唯一的參數是一個List,Y是一個接口,根本沒有問題...

+0

謝謝!我有類似的問題。我有一個看起來像Collection foo()的簽名;我用一個實現(ArrayList)替換了Collection,它工作。 – pyb 2015-03-19 13:38:50

2

我遇到了這個問題,如果你有機會使用JPA或Hibernate,這可能是試圖返回查詢對象,而不是創建一個新對象,並將相關字段複製到該新對象中。檢查以下內容,我在谷歌組中看到。

 @SuppressWarnings("unchecked") 
    public static List<Article> getForUser(User user) 
    { 
      List<Article> articles = null; 
      PersistenceManager pm = PMF.get().getPersistenceManager(); 
      try 
      { 
        Query query = pm.newQuery(Article.class); 
        query.setFilter("email == emailParam"); 
        query.setOrdering("timeStamp desc"); 
        query.declareParameters("String emailParam"); 
        List<Article> results = (List<Article>) query.execute(user.getEmail 
    ()); 
        articles = new ArrayList<Article>(); 
        for (Article a : results) 
        { 
          a.getEmail(); 
          articles.add(a); 
        } 
      } 
      finally 
      { 
        pm.close(); 
      } 
      return articles; 
    } 

這幫了我很多,希望它指向了正確的方向。

+0

請參閱http://www.gwtproject.org/articles/using_gwt_with_hibernate.html – leeyuiwah 2015-09-29 15:41:12