0

我在客户端创建了两个类,它们使用 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: Type 'org.datanucleus.store.types.sco.backed.ArrayList' is not included in the set of types which可以通过此 SerializationPolicy 进行序列化,否则无法加载其 Class 对象。出于安全目的,此类型不会被序列化。

我不知道出了什么问题。欢迎任何建议。

4

2 回答 2

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 复制列表,因此它不再连接到数据存储区,这是为我消除错误的魔力。

有一个可以使用的注释,我从文档中引用:

您可以在 PersistenceManager 关闭后通过将类声明为“可拆卸”来修改对象。为此,请将可拆卸属性添加到 @PersistenceCapable 注释:

@PersistenceCapable(detachable="true")

不确定这是否意味着你可以做你最初做的事情,但值得一试,因为我认为我的解决方案并不“漂亮”。

于 2013-11-08T14:33:42.917 回答
0

更改ArrayList声明以使用 Java 的ArrayList

   java.util.ArrayList<Park> parkList = new java.util.ArrayList<Park>();

GWT无法序列化没有默认构造函数的对象,并且ArrayList您导入的 (org.datanucleus.store.types.sco.backed.ArrayList) 不提供默认构造函数,导致序列化失败。

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

于 2013-03-15T17:44:01.483 回答