私のGoogle Web Toolkitプロジェクトで、次のエラーが発生しました。
com.google.gwt.user.client.rpc.SerializationException:タイプ「your.class.Type」が、このSerializationPolicyでシリアル化できるタイプのセットに含まれていないか、そのクラスオブジェクトをロードできませんでした。セキュリティ上の理由から、このタイプはシリアル化されません。
このエラーの考えられる原因は何ですか?
GWTは、シリアル化してクライアントに送信できる一連のタイプを追跡します。 your.class.Type
は明らかにこのリストに含まれていませんでした。このようなリストは.gwt.rpc
ファイルに保存されます。これらのリストは生成されるため、これらのリストを編集してもおそらく役に立たないでしょう。これらのリストがどのように生成されるかは少し不明確ですが、次のことを試すことができます。
your.class.Type
がJava.io.Serializable
を実装していることを確認してくださいyour.class.Type
にパブリックの引数なしコンストラクターがあることを確認してくださいyour.class.Type
のメンバーが同じことをすることを確認してください
プログラムにシリアル化できないタイプのコレクションが含まれていないかどうかを確認します。 ArrayList<Object>
。そのようなコレクションにyour.class.Type
が含まれ、シリアル化されている場合、このエラーが発生します。
your.class.Type
にIsSerializable
を実装させます。このマーカーインターフェイスは、クライアントに送信する必要のあるクラスを対象としています。これは私にとってはうまくいきませんでしたが、私のクラスもSerializable
を実装していたので、両方のインターフェースが一緒にうまく機能しない可能性があります。
もう1つのオプションは、your.class.Type
をメンバーとして使用してダミークラスを作成し、ダミーを取得して返すメソッドをRPCインターフェイスに追加することです。これにより、GWTコンパイラはダミークラスとそのメンバーをシリアル化ホワイトリストに追加します。
また、ネストされたクラスを使用する場合は、静的メンバークラスを使用することも追加します。つまり、
public class Pojo {
public static class Insider {
}
}
非静的メンバークラスがGWT 2.4でSerializationExceptionを取得する
私はこのようなRemoteServiceで同じ問題がありました
public List<X> getX(...);
ここで、Xはインターフェースです。唯一の実装はルールに準拠していました。つまり、SerializableまたはIsSerializableを実装し、デフォルトのコンストラクターを持ち、そのすべての(非一時的および非最終)フィールドもこれらのルールに従います。
しかし、結果タイプをListからX []に変更するまで、SerializationExceptionが発生し続けたので、
public X[] getX(...);
働いた。興味深いことに、唯一の引数はリストであり、Yはインターフェイスであり、まったく問題ありませんでした...
私はこの問題に遭遇しました。たまたま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;
}
これは私を大いに助けました、うまくいけば、それは他の人を正しい方向に向けます.
この質問は GWTでIsSerializableかどうか に非常に似ているように見えます。関連ドキュメントへのリンクをもっと参照してください。
あなたのクラスにJDOアノテーションがある場合、これは私のためにそれを修正しました(bspoelの答えのポイントに加えて): https://stackoverflow.com/a/4826778/1099376