【问题标题】:SerializationException: type not included in serializable type setSerializationException:类型未包含在可序列化类型集中
【发布时间】:2011-07-09 19:15:57
【问题描述】:

在我的 Google Web Toolkit 项目中,出现以下错误:

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

这个错误的可能原因是什么?

【问题讨论】:

  • 表示Async调用的返回类型没有序列化。要对此进行排序,请在返回类型类中实现 java.io.seriablizable 接口。

标签: serialization gwt-rpc


【解决方案1】:

当您的班级有 JDO 注释时,这会为我修复它(除了 bspoel 回答中的要点):https://stackoverflow.com/a/4826778/1099376

【讨论】:

    【解决方案2】:

    我遇到了这个问题,如果您有机会使用 JPA 或 Hibernate,这可能是由于尝试返回查询对象而不是创建新对象并将相关字段复制到该新对象中的结果。检查以下内容,这是我在 google 组中看到的。

         @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; 
        } 
    

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

    【讨论】:

      【解决方案3】:

      我在这样的 RemoteService 中遇到了同样的问题

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

      其中 X 是一个接口。唯一的实现确实符合规则,即实现 Serializable 或 IsSerializable,具有默认构造函数,并且其所有(非瞬态和非最终)字段也遵循这些规则。

      但我一直收到 SerializationException,直到我将结果类型从 List 更改为 X[],所以

      public X[] getX(...);
      

      工作。有趣的是,唯一的参数是 List,Y 是一个接口,完全没有问题......

      【讨论】:

      • 谢谢!我有一个类似的问题。我的签名看起来像 Collection foo();我用一个实现(ArrayList)替换了Collection,它起作用了。
      【解决方案4】:

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

      public class Pojo {
          public static class Insider {
          }
      }
      

      非静态成员类在 GWT 2.4 中获得 SerializationException

      【讨论】:

      • 将班级移到外面是另一种选择。
      【解决方案5】:

      看起来这个问题与what IsSerializable or not in GWT? 非常相似,请在此处查看相关文档的更多链接。

      【讨论】:

        【解决方案6】:

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

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

        • 检查您的程序是否不包含不可序列化类型的集合,例如ArrayList&lt;Object&gt;。如果这样的集合包含your.class.Type并被序列化,就会出现这个错误。

        • 使your.class.Type 实现IsSerializable。此标记接口专门用于应发送到客户端的类。这对我不起作用,但我的类也实现了Serializable,所以可能两个接口不能很好地协同工作。

        • 另一种选择是创建一个以your.class.Type 为成员的虚拟类,并向您的RPC 接口添加一个获取和返回虚拟对象的方法。这会强制 GWT 编译器将虚拟类及其成员添加到序列化白名单中。

        【讨论】:

        • 太棒了!我没有添加默认构造函数......不知道该构造函数用于序列化类型的目的......但我的老板在修复它后向我解释了它...... --再次感谢:)
        • 你是救命稻草。刚刚在链接isolasoftware.it/2011/03/22/gwt-serialization-policy-error获得了更多信息
        • 这可能不适用于enum 类型吗?
        猜你喜欢
        • 1970-01-01
        • 2012-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-27
        • 2013-04-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多