我在客户端创建了两个类,它们使用GWT JDO存储 父类看起来像:
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Park implements Serializable{
@PrimaryKey
@Persistent
private String parkId;
//...
@Persistent(mappedBy = "park", defaultFetchGroup = "true")
private List<Facility> facilityList;
// other stuff
和孩子看起来像:
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Facility implements Serializable{
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String encodedKey;
@Persistent
private Park park;
// other stuff
在服务器端,我有一个获取所有内容的方法:
public Park[] getParks(){
PersistentManager pm = getPersistentManager();
ArrayList<Park> parkList = new ArrayList<Park>();
try {
Query q = pm.newQuery(Park.class);
List<Park> parks = (List<Park>) q.execute();
for(Park p:parks)
parkList.add(p);
} finally {
pm.close();
}
return parkList.toArray(new Park[parkList.size()]);
}
当我调用此方法时,它会抛出异常:
com.google.gwt.user.client.rpc.SerializationException:键入&#39; org.datanucleus.store.types.sco.backed.ArrayList&#39;未包含在可由此SerializationPolicy序列化的类型集中,或者无法加载其Class对象。出于安全考虑,此类型不会被序列化。
我无法弄清楚什么是错的。欢迎提出任何建议。
答案 0 :(得分:1)
我有一段时间没遇到这个问题而且非常令人沮丧。而且我也很确定你的问题不是因为你导入了错误的包。你可能已经解决了这个问题,但是如果有其他人需要解决这个问题的话。
尝试以下示例代码:
public Park[] getParks(){
PersistentManager pm = getPersistentManager();
List<Park> parkList = null;
try {
Query q = pm.newQuery(Park.class);
parkList = (List<Park>) q.execute();
parkList = pm.detachCopyAll(parkList);
} finally {
pm.close();
}
return parkList.toArray(new Park[parkList.size()]);
}
在上面的示例中,我将ArrayList更改为List(不确定是否必要)并使用detachCopyAll复制列表,使其不再连接到数据存储区,这是为我删除错误的魔力。
我可以使用注释,我引用documentation:
您可以在关闭PersistenceManager后修改对象 通过将该类声明为“可拆卸”。为此,请添加可拆卸的 属性为@PersistenceCapable注释:
@PersistenceCapable(detachable="true")
不确定这是否意味着你可以做到,你最初做了什么,但是值得一试,因为我不认为我的解决方案是“漂亮的”。
答案 1 :(得分:0)
更改ArrayList
声明以使用Java的ArrayList
:
java.util.ArrayList<Park> parkList = new java.util.ArrayList<Park>();
GWT
无法序列化没有默认构造函数的对象,并且导入的ArrayList
(org.datanucleus.store.types.sco.backed.ArrayList)不提供默认构造函数,使序列化失败。
您可能错误地导入了此类,在这种情况下您只需更改导入声明即可。但是如果你在其他地方使用它,那么你必须使用完整的限定符,如图所示。