web-dev-qa-db-ja.com

SerializationException:シリアル化可能なタイプセットに含まれていないタイプ

私のGoogle Web Toolkitプロジェクトで、次のエラーが発生しました。

com.google.gwt.user.client.rpc.SerializationException:タイプ「your.class.Type」が、このSerializationPolicyでシリアル化できるタイプのセットに含まれていないか、そのクラスオブジェクトをロードできませんでした。セキュリティ上の理由から、このタイプはシリアル化されません。

このエラーの考えられる原因は何ですか?

29
bspoel

GWTは、シリアル化してクライアントに送信できる一連のタイプを追跡します。 your.class.Typeは明らかにこのリストに含まれていませんでした。このようなリストは.gwt.rpcファイルに保存されます。これらのリストは生成されるため、これらのリストを編集してもおそらく役に立たないでしょう。これらのリストがどのように生成されるかは少し不明確ですが、次のことを試すことができます。

  • your.class.TypeJava.io.Serializableを実装していることを確認してください
  • your.class.Typeにパブリックの引数なしコンストラクターがあることを確認してください
  • your.class.Typeのメンバーが同じことをすることを確認してください

  • プログラムにシリアル化できないタイプのコレクションが含まれていないかどうかを確認します。 ArrayList<Object>。そのようなコレクションにyour.class.Typeが含まれ、シリアル化されている場合、このエラーが発生します。

  • your.class.TypeIsSerializableを実装させます。このマーカーインターフェイスは、クライアントに送信する必要のあるクラスを対象としています。これは私にとってはうまくいきませんでしたが、私のクラスもSerializableを実装していたので、両方のインターフェースが一緒にうまく機能しない可能性があります。

  • もう1つのオプションは、your.class.Typeをメンバーとして使用してダミークラスを作成し、ダミーを取得して返すメソッドをRPCインターフェイスに追加することです。これにより、GWTコンパイラはダミークラスとそのメンバーをシリアル化ホワイトリストに追加します。

65
bspoel

また、ネストされたクラスを使用する場合は、静的メンバークラスを使用することも追加します。つまり、

public class Pojo {
    public static class Insider {
    }
}

非静的メンバークラスがGWT 2.4でSerializationExceptionを取得する

4
RodK

私はこのようなRemoteServiceで同じ問題がありました

public List<X> getX(...);

ここで、Xはインターフェースです。唯一の実装はルールに準拠していました。つまり、SerializableまたはIsSerializableを実装し、デフォルトのコンストラクターを持ち、そのすべての(非一時的および非最終)フィールドもこれらのルールに従います。

しかし、結果タイプをListからX []に変更するまで、SerializationExceptionが発生し続けたので、

public X[] getX(...);

働いた。興味深いことに、唯一の引数はリストであり、Yはインターフェイスであり、まったく問題ありませんでした...

3
Pat

私はこの問題に遭遇しました。たまたま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; 
    } 

これは私を大いに助けました、うまくいけば、それは他の人を正しい方向に向けます.

2
rjdamore

この質問は GWTでIsSerializableかどうか に非常に似ているように見えます。関連ドキュメントへのリンクをもっと参照してください。

1
alexandroid

あなたのクラスにJDOアノテーションがある場合、これは私のためにそれを修正しました(bspoelの答えのポイントに加えて): https://stackoverflow.com/a/4826778/1099376

0
vambo