web-dev-qa-db-ja.com

GWTアプリケーション内からRPCを実行するときのSerializationPolicyエラー

次の例外が発生します。

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

gWT2.1と組み込みのJettyサーバーを使用します。ドキュメントによると、このタイプは間違いなくシリアル化可能です... SerializationPolicyに含めるにはどうすればよいですか?

21
Tyson

必要なのは、RPCサービスに、多数のオブジェクトを「ホワイトリストに登録」する不要なメソッドを含めることです。これはジェネリックの使用が原因で発生します。GWTは、シリアル化してジェネリックに含める可能性のあるオブジェクトを必ずしも判別できません。

オブジェクト(SerializableWhitelist)のメンバーとして(非)シリアル化する必要がある可能性のあるすべてのタイプを含めました。次のようなメソッドをRPCサーブレットオブジェクトに追加しました。

public SerializableWhitelist junk(SerializableWhitelist l) { return null; }

GWTは明らかに2つの別個のシリアル化ポリシーを維持しているため、ホワイトリストのデータ型を引数と戻り値の型の両方として含めることはneedであることに注意してください。

20
Tyson

問題を解決する必要があるリンクは次のとおりです。 http://developerlife.com/tutorials/?p=131

次の場合、ユーザー定義クラスはシリアライズ可能です。

  1. クラスは、これらのインターフェイスの1つを実装するため、またはこれらのインターフェイスの1つを実装するスーパークラスから派生するため、IsSerializableまたはJava.io.Serializableに割り当てることができます。
  2. クラスのすべての非最終、非一時的なインスタンスフィールドはシリアル化可能です
  3. クラスにはパブリックデフォルト(引数なし)コンストラクターがあります
28
Krzysztof Uroda

War/appディレクトリの* .gwt.rpcファイルを削除し、クリーンアップして再構築してみてください。

注意すべき1つのこと:可能であれば、longまたはLongは避ける必要があります。
GWTでエミュレートされ(ネイティブJavascriptが長いため)、非常に
スロー。可能な限り、代わりにintを使用してください。

8
Peter Knego

参考までに、これをGWTバグとして提起しました: http://code.google.com/p/google-web-toolkit/issues/detail?id=5811

彼らの言うことを見ていきます。

4
David North

FWIW、私はこの問題を抱えていましたが、私の「オブジェクト」タイプは生成されたクラスの背後に隠されていますでした。エラーメッセージ自体が間違っていました。

したがって、rpcメソッドの1つにクラスが含まれる場合:

class Xxx<T> implements IsSerializable {...

次のように変更する必要があります。

class Xxx<T extends IsSerializable> implements IsSerializable {...
3
Peter L

この問題は、ホストモードを実行しているローカルマシンのコードが、RPCを介して接続している外部サーバーのコードと同じでないことが原因である可能性もあります。そのため、私の場合、外部サーバーにデプロイされたものと一致するローカルマシンのgitpullがありませんでした。変更は最小限で、gwt.rpcに含まれているクラスの1つに新しいプロパティが含まれているだけでしたが、gwt.rpc md5ファイル名が異なるため、上記のエラーが発生しました。

1
Dominik Steiner

私はこのエラーに直面し、1日間完全に立ち往生しました。それから私は次の簡単な解決策に出くわしました:

DTOまたはエンティティクラスがシリアル化可能なインターフェイスルールに従っていることを確認してください。残りの問題はビルドの作成にあるため、これを行う必要があるのはこれだけです。したがって、Mavenを使用している場合は、クリーンビルドを実行し、すべてのブラウザーキャッシュをクリアしてください。これで問題を解決しました。お役に立てば幸いです。ありがとう!

0
Aman Goel

クラスが共有フォルダーにあることを確認してください。これは私が欠けていたものです。

0
Mini Agarwal

別のFWIW:単一の1つの引数コンストラクターのアクセス修飾子をデフォルト(修飾子なし)から「private」に変更することで、列挙型クラスの同様の問題を解決したと思います。いずれにせよ、今はそのように機能しているので、それを行っても問題はありませんでした。

0
Mark Villa

インスピレーション http://groups.google.com/group/google-web-toolkit/browse_thread/thread/7dd5123d359ddfa8

EclipseとMavenおよびgwt2.1.1の使用

Gwtwarをコンパイルしてデプロイします。

Eclipseから起動したOOPHMを使用してみてください。

これは私にとって失敗するでしょう。

これはサーバーログに生成されます:

エラー:シリアル化ポリシーファイル 'blah.gwt.rpc'が見つかりませんでした。この展開に含めるのを忘れましたか?

警告:モジュール 'http:// blah:8080/BlahUI/BlahUI /'のSerializationPolicy'94DEC228B2828D3A5897FEE3D6845A40 'の取得に失敗しました。従来の1.3.3互換のシリアル化ポリシーが使用されます。その結果、SerializationExceptionsが発生する場合があります。

その後

着信RPC呼び出しのディスパッチ中の例外com.google.gwt.user.client.rpc.SerializationException:タイプ '[LpathToClass;' 'com.google.gwt.user.client.rpc.IsSerializable'に割り当てることができず、カスタムフィールドシリアライザーがありませんでした。セキュリティ上の理由から、このタイプはシリアル化されません。:instance = [LpathToClass; @ 9d524af atcom。 google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.Java:614)

これで、追加のgwt.rpcファイルが生成されました(Eclipse/mavenプラグインのどちらかを知っていますか?)

再コンパイルし(gwt.rpcファイルがターゲットフォルダーにないため、クリーンコンパイルでも機能します。私のOOPHM gwt.rpcファイルはエントリポイントhtmlと同じフォルダーにあります)、再デプロイします。この新しいwarファイルには、生成されたgwt.rpcファイルが含まれます。

EclipseからOOPHMを再起動します。

私のために働きます。

0
Thomas Newman