0

クライアント側に 2 つのクラスを作成し、それらは 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' was 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 が閉じられた後にオブジェクトを変更できます。これを行うには、detachable 属性を @PersistenceCapable アノテーションに追加します。

@PersistenceCapable(detachable="true")

これがあなたが最初にやったことができることを意味するかどうかはわかりませんが、私の解決策が「きれい」だとは思わないので、試してみる価値があります.

于 2013-11-08T14:33:42.917 に答える
0

ArrayListJava の を使用するように宣言を変更し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 に答える