0

我正在尝试使用 GWT + Spring + Hibernate lunshing 应用程序时出现此错误:

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

4

1 回答 1

2

您需要将 DTO 对象发送到客户端(而不是由 Hibernate 支持的原始对象)。问题是您的 Personne 对象实际上是一个 Hibernate 代理。每次当你调用它的一些方法时,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 对象,将状态复制到它,然后发送到 UI。Personne不能在客户端使用,因为Personne.getAddresses()在大多数情况下点击 DB 来获取数据(这在客户端 JS 中是不可能的)。因此,每个都Personne必须PersonneDto在客户端替换。不利的一面是,您需要维护额外的 DTO 对象层和相应的代码来将实体转换为 DTO。这个问题还有另一种方法。有关更多详细信息,请参阅本文

于 2013-05-28T15:13:44.173 回答