在我的Google Web Toolkit项目中,我收到以下错误:
com.google.gwt.user.client.rpc.SerializationException:类型'your.class.Type'未包含在可由此SerializationPolicy序列化的类型集中,或者无法加载其Class对象。出于安全考虑,此类型不会被序列化。
出现此错误的可能原因是什么?
答案 0 :(得分:65)
GWT跟踪可以序列化并发送到客户端的一组类型。 your.class.Type
显然不在此列表中。这样的列表存储在.gwt.rpc
个文件中。生成这些列表,因此编辑这些列表可能毫无用处。如何生成这些列表有点不清楚,但您可以尝试以下方法:
your.class.Type
实施java.io.Serializable
your.class.Type
有一个公共的无参数构造函数确保your.class.Type
的成员执行相同的
检查您的程序是否不包含非可序列化类型的集合,例如ArrayList<Object>
。如果此类集合包含your.class.Type
并且已序列化,则会发生此错误。
让your.class.Type
实施IsSerializable
。此标记接口专门用于应发送到客户端的类。这对我不起作用,但我的课程也实现了Serializable
,所以两个界面可能不能很好地协同工作。
另一种选择是创建一个以your.class.Type
为成员的虚拟类,并向RPC接口添加一个获取并返回虚拟对象的方法。这会强制GWT编译器将虚拟类及其成员添加到序列化白名单中。
答案 1 :(得分:4)
我还要补充说,如果要使用嵌套类,请使用静态成员类。 即,
public class Pojo {
public static class Insider {
}
}
非静态成员类在GWT 2.4中获取SerializationException
答案 2 :(得分:3)
我在像这样的RemoteService中遇到了同样的问题
public List<X> getX(...);
其中X是一个接口。唯一的实现符合规则,即实现Serializable或IsSerializable,具有默认构造函数,并且其所有(非瞬态和非最终)字段也遵循这些规则。
但是我一直得到SerializationException,直到我将结果类型从List改为X [],所以
public X[] getX(...);
的工作。有趣的是,唯一的参数是List,Y是一个接口,完全没问题......
答案 3 :(得分: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;
}
这对我帮助很大,希望它能指出其他人正确的方向。
答案 4 :(得分:1)
看起来这个问题与what IsSerializable or not in GWT?非常相似,请参阅相关文档的更多链接。
答案 5 :(得分:0)
当你的班级有JDO注释时,这就为我修好了(除了bspoel答案中的几点):https://stackoverflow.com/a/4826778/1099376