我正在尝试使用GWT + Spring + Hibernate 在浏览应用程序时,我收到此错误:
com.google.gwt.user.client.rpc.SerializationException:类型'org.hibernate.collection.PersistentBag'未包含在可由此SerializationPolicy序列化的类型集中,或者无法加载其Class对象。出于安全考虑,此类型不会被序列化:instance = [com.asso.shared.model.Activite@64d6357a]
将此方法与持久性类的列表一起使用后:
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 = [com.asso.shared.model.Personne@75a2fb58]
==========================================
我搜索了其他科目,但我找不到任何解决方案! 我该怎么解决这个序列化的事情!? 我在我的持久化课程中使用List
答案 0 :(得分: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 {
}
您需要创建新的PersonneDto对象,将状态复制到该对象,然后发送到UI,而不是将Personne发送到客户端。 Personne
不能在客户端使用,因为Personne.getAddresses()
在大多数情况下命中DB来获取数据(这在客户端JS中是不可能的)。因此,每个Personne
必须在客户端由PersonneDto
替换。作为一个缺点,您需要提供额外的DTO对象和相应的代码以将实体转换为DTO。还有另一种解决这个问题的方法。有关详细信息,请参阅this article。