SerializationException:可序列化类型集中不包括类型

SerializationException:可序列化类型集中不包括类型,serialization,gwt-rpc,Serialization,Gwt Rpc,在我的Google Web Toolkit项目中,我遇到以下错误: com.google.gwt.user.client.rpc.SerializationException:类型“your.class.Type”未包含在此可由此序列化策略序列化的类型集中,或者无法加载其类对象。出于安全目的,不会序列化此类型 此错误的可能原因是什么?GWT跟踪一组可以序列化并发送到客户端的类型your.class.Type显然不在此列表中。类似的列表存储在.gwt.rpc文件中。这些列表是生成的,因此编辑这些列

在我的Google Web Toolkit项目中,我遇到以下错误:

com.google.gwt.user.client.rpc.SerializationException:类型“your.class.Type”未包含在此可由此序列化策略序列化的类型集中,或者无法加载其类对象。出于安全目的,不会序列化此类型


此错误的可能原因是什么?

GWT跟踪一组可以序列化并发送到客户端的类型
your.class.Type
显然不在此列表中。类似的列表存储在
.gwt.rpc
文件中。这些列表是生成的,因此编辑这些列表可能是无用的。这些列表是如何生成的还不清楚,但您可以尝试以下方法:

  • 确保
    your.class.Type
    实现
    java.io.Serializable
  • 确保
    您的.class.Type
    具有公共的无参数构造函数
  • 确保.class.Type的
    成员也这样做

  • 检查您的程序是否不包含不可序列化类型的集合,例如
    ArrayList
    。如果此类集合包含.class.Type
    ,并且已序列化,则会发生此错误

  • 使
    成为您的.class.Type
    实现
    可序列化
    。此标记接口专门用于应发送到客户端的类。这对我来说不起作用,但我的类还实现了可序列化的
    ,所以这两个接口可能不能很好地协同工作

  • 另一个选项是使用
    your.class.Type
    作为成员创建一个伪类,并向RPC接口添加一个获取并返回该伪类的方法。这迫使GWT编译器将伪类及其成员添加到序列化白名单中


看起来这个问题非常类似,请参阅相关文档的更多链接。

我还要补充一点,如果要使用嵌套类,请使用静态成员类。 即


非静态成员类在GWT2.4中遇到SerializationException,我在类似这样的远程服务中遇到了同样的问题

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

成功了。有趣的是,唯一的参数是一个列表,Y是一个接口,一点问题都没有…

我遇到了这个问题,如果您使用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; 
    } 
@SuppressWarnings(“未选中”)
公共静态列表getForUser(用户用户)
{ 
列表文章=空;
PersistenceManager pm=PMF.get().getPersistenceManager();
尝试
{ 
Query Query=pm.newQuery(Article.class);
query.setFilter(“email==emailParam”);
query.setOrdering(“timeStamp desc”);
declareParameters(“字符串emailParam”);
List results=(List)query.execute(user.getEmail
()); 
articles=新的ArrayList();
(a条:结果)
{ 
a、 getEmail();
加入(a);
} 
} 
最后
{ 
pm.close();
} 
归还物品;
} 

这对我帮助很大,希望它为其他人指明了正确的方向。

当您的类有JDO注释时,这为我修复了它(除了bspoel答案中的要点):

这意味着异步调用的返回类型没有序列化。要对此进行排序,请在返回类型类中实现java.io.seriablizable接口。太棒了!我没有添加默认构造函数。。。不知道序列化类型的构造函数的用途。。。。但我的老板在修好后给我解释了--再次感谢:)你是个救命恩人。。刚刚在链接中获得了更多信息这是否可能不适用于
enum
类型?谢谢!我也有类似的问题。我有一个签名,看起来像集合foo();我用一个实现(ArrayList)替换了集合,它成功了。将类移到外部是另一种选择。
public X[] getX(...);
     @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; 
    }