14

次のメソッドを持つ RPC サービスがあります。

public List<Serializable> myMethod(TransactionCall call) {...}

しかし、このメソッドが分析されると警告が表示され、rpc 呼び出しが失敗します。

Analyzing 'my.project.package.myService' for serializable types
Analyzing methods:
public abstract java.util.List<java.io.Serializable> myMethod(my.project.package.TransactionCall call)
Return type: java.util.List<java.io.Serializable>
[...]
java.io.Serializable
Verifying instantiability
(!) Checking all subtypes of Object which qualify for serialization

リストに Serializable を使用できないようです...代わりに独自のインターフェイス (Serializable インターフェイスを実装する AsyncDataInterface など) を使用できますが、実際には、私のメソッドはカスタム オブジェクトと基本オブジェクトのリストを返します (そのようなもの)文字列、int など)。

だから私の質問は:

  • それは標準的な動作ですか?(その場合、このインターフェイスを使用できない理由がわかりません)
  • そのような状況の回避策はありますか?
4

3 に答える 3

29

RPC 呼び出しでオブジェクトを渡す場合、RPC インターフェイスで具体的なパラメーターの型を宣言することをお勧めします。何らかの理由で RPC インターフェイスで具象クラスを使用できない場合は、できるだけ具体的にするようにしてください。

これは、GWT コンパイラーが javascript を発行する際に、コンパイル単位で List のすべての可能なバリアントを考慮に入れる必要があるためです。これには、クラス パス内の List および Serializable インターフェイスを拡張するすべてのクラスが含まれます。順列は巨大になる可能性があり、コンパイル時間とアプリケーションのダウンロード サイズに影響します。

したがって、最良のアプローチは、インターフェイスを次のように定義することです

public ArrayList<YourType> myMethod(TransactionCall call) {...}

それよりも

public List<Serializable> myMethod(TransactionCall call) {...}

そうすれば、コンパイラは ArrayList および YourType 拡張機能のみのコンパイル ユニットを生成する必要があります。利点は、コンパイル時間が短縮され、コンパイルされた JavaScript ファイルが小さくなるため、アプリケーションのダウンロードが高速になることです。

RPC 呼び出しで関連のないさまざまなオブジェクトを返す必要がある場合は、ラッパー クラスを作成し、戻り値がラップされたラッパー クラスの戻りオブジェクトを作成してみてください。RPC メソッド定義でラッパー クラスを使用します。ラップされたフィールドを Object または Serializable として宣言する衝動に抵抗してください。ラッパーを使用することによって得られたシリアル化の利点をすべて無効にすることになります。代わりに、RPC 呼び出しを介して返したい具体的な型ごとに、Wrapper インターフェイスと Wrapper 実装の小さなセットを定義できます。

于 2010-06-17T09:01:29.763 に答える
1

シリアル化ポリシー ファイルが問題の原因ではないことを確認することをお勧めします。

GWT ドキュメントからの引用:

ただし、新しい GWT RPC システムで java.io.Serializable のサポートを有効にするための条件が 1 つあります。

RPC は、GWT のコンパイル中にシリアライゼーション ポリシー ファイルを生成するようになりました。シリアル化ポリシー ファイルには、シリアル化できる許可された型のホワイトリストが含まれています。その名前は、強力なハッシュ名の後に .gwt.rpc が続きます。java.io.Serializable のサポートを有効にするには、アプリケーションがネットワーク経由で送信するタイプをシリアライゼーション ポリシーのホワイトリストに含める必要があります。また、シリアライゼーション ポリシー ファイルは、ServletContext.getResource() を介して RemoteServiceServlet からアクセスできるパブリック リソースとして Web サーバーにデプロイする必要があります。適切にデプロイされていない場合、RPC は 1.3.3 互換モードで実行され、java.io.Serializable を実装する型のシリアル化を拒否します。

于 2010-06-17T08:03:37.740 に答える
0

List<Serializable> を戻り値として定義する意味がわかりません。タイプ Serializable は、サービス API 宣言に追加情報を提供しません。いずれにせよ、GWT は実行時にシリアライゼーション チェックを行います。

あなたの場合、リスト要素にオブジェクト以外の共通の祖先がない場合、List<?> を使用します。

于 2010-06-17T08:15:56.397 に答える