2013-05-28 45 views
0

我想如果lunshing應用程序使用GWT + Spring + Hibernate的 我得到這個錯誤:GWT:SerializationException

com.google.gwt.user.client.rpc.SerializationException:類型「org.hibernate作爲.collection.PersistentBag'未包含在可由此SerializationPolicy序列化的類型集合中,或者其Class對象無法加載。爲了安全起見,這種類型將不被序列:實例=使用此方法與持久類的列表之後[[email protected]]

public static <T> ArrayList<T> makeGWTSafe(List<T> list) { 
     if(list instanceof ArrayList) { 
      return (ArrayList<T>)list; 
     } else { 
      ArrayList<T> newList = new ArrayList<T>(); 
      newList.addAll(list); 
      return newList; 
     } 
    } 

與我的名單我得到這個:

com.google.gwt.user.client.rpc.SerializationException:類型'org.hibernate.collection.PersistentBag'不包括在可以通過此SerializationPolicy序列化的類型集或者其Class對象無法加載。出於安全目的,這種類型不會被序列化。:instance = [[email protected]]

=================== =======================

我已經在其他科目搜索,但我找不到任何解決方案! 我該如何解決這個序列化的事情? 我在持久性類中使用List

回答

2

您需要將DTO對象發送到客戶端(而不是由Hibernate支持的原始對象)。問題是你的Personne對象實際上是一個Hibernate代理。每次當你調用它的某些方法時,Hibernate會做一些工作(例如從DB獲取集合)。沒有簡單的方法來序列化這種類型的對象。

Hibernate的實體:

//Hibernate entity 
public class Personne { 

    private String name; 
    private List<Address> addresses; 
} 

//Hibernate entity 
public class Address { 


} 

通訊DTO對象:

public class PersonneDto { 

    private String name; 
    private List<AddressDto> addresses; 
} 

public class AddressDto { 


} 

而不是發送Personne你需要創建新的PersonneDto對象客戶端的複製狀態,然後發送到用戶界面。 Personne不能在客戶端使用,因爲Personne.getAddresses()在大多數情況下命中DB來獲取數據(這在客戶端JS中是不可行的)。因此,在客戶端,每個Personne必須替換爲PersonneDto。作爲一個缺點,你需要維護更多的DTO對象和相應的代碼來將實體轉換爲DTO。還有另一種解決這個問題的方法。有關更多詳細信息,請參見this article

+0

如果可能的話,我需要一個非常清晰的解釋和可運行的示例!如果你能做到這一點,你應該知道你救了我,在地球上的某個陌生人 –

+0

PS:添加(Personne p)的工作,但是當談到get()我有這個序列化錯誤 –

+0

我不明白以及在哪裏使用DTO課程!在服務器端,我操作Personne類,並且與其他類有ManyToMany關係!如何在此處使用DTO –