从jdo数据存储区中获取数据

时间:2013-03-15 17:35:10

标签: java gwt serialization jdo

我在客户端创建了两个类,它们使用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对象。出于安全考虑,此类型不会被序列化。

我无法弄清楚什么是错的。欢迎提出任何建议。

2 个答案:

答案 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)不提供默认构造函数,使序列化失败。

您可能错误地导入了此类,在这种情况下您只需更改导入声明即可。但是如果你在其他地方使用它,那么你必须使用完整的限定符,如图所示。