0

Date が GWT 2.4.0 によってシリアル化される方法に問題がありました。最も簡単な解決策は、元の実装をオーバーロードする Date_CustomFieldSerializer を作成することです。

しかし、アプリケーションの起動方法によっては、異なる結果が得られます。幸いなことに、デプロイされたバージョンは問題なく動作するようです。一方、Eclipse からデバッグ セッションを開始すると、次のメッセージが表示されます。

com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException: The response could not be deserialized
    at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:221)
    at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:287)
    at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:395)
    ...
Caused by: com.google.gwt.user.client.rpc.SerializationException: java.util.Date/1659716317
    at com.google.gwt.user.client.rpc.impl.SerializerBase.getTypeHandler(SerializerBase.java:153)

サーバー側とクライアント側の両方をデバッグしましたが、サーバーはシリアライザーを使用しており、「型シグネチャ」でシリアライザーを検索しているときにクライアント側が失敗します。java.util.Date/1659716317

奇妙なことに、クライアントには のシリアライザーを含むマップがありますjava.util.Date/965047388

GWT はこれらの型シグネチャをどのように作成し、GWT デバッガーを使用しているときにどのように異なるのでしょうか?

- 編集 -

数値がどのように生成されるかがわかりました。GWT は、階層内のクラス名 (場合によってはメソッドも) の CRC32 ハッシュを計算します。

java.util.Date
com.google.gwt.user.client.rpc.core.java.util.Date_CustomFieldSerializer
java.lang.Object
--> 1659716317 (server side)

java.util.Date
java.lang.Object
--> 965047388 (client side)

CompilingClassLoader と実行時に生成されたクラスの間のどこかにあるため、GWT がクライアント側のハッシュを計算してシリアライザーを認識しない理由を確認する場所を見つけることができません。

4

2 に答える 2

1

この同じ問題を抱えている人のために、数日間エラーメッセージが表示されました.昨日、原因が見つかりました!

クラスパスに Date_CustomFieldSerializer クラスの異なるバージョンの 2 つのバージョンがありました。プロジェクトで使用するGoogle gin 1.5ライブラリの依存関係であるgwt-servlet-2.2.0.jarにあったため、間違ったものがクラスパスに追加されました。

プロジェクトの Google gin をバージョン 2.1.2 にアップグレードしましたが、gwt-servlet への依存関係はありません。このようにして、Date_CustomFieldSerializer クラスの異なるバージョンがクラスパスに含まれないようにする必要があります。同じ原因があり、Google gin をアップグレードしたくない場合は、pom の google gin 1.5 依存関係から依存関係 gwt-servlet-2.2.0 を単純に除外できます。このような:

<dependencies>
  <dependency>
    <groupId>sample.ProjectA</groupId>
    <artifactId>Project-A</artifactId>
    <version>1.0</version>
    <scope>compile</scope>
    <exclusions>
      <exclusion>  <!-- declare the exclusion here -->
        <groupId>sample.ProjectB</groupId>
        <artifactId>Project-B</artifactId>
      </exclusion>
    </exclusions> 
  </dependency>
</dependencies>
于 2014-09-24T07:34:48.113 に答える
0

クライアント側にシリアライザがなかった理由は、単に GWT がそれを JavaScript にコンパイルできなかったためです (サーバー側のロギング参照が誤って追加されたため)。

「厳密な」コンパイル規則を使用しない限り、これらの JavaScript コンパイルは暗黙のうちに失敗し (または、他のメッセージに埋もれてしまうコンパイラ出力に 1 行を追加します)、必要になるまで何が欠けているのかわかりません。

于 2013-09-24T10:12:38.307 に答える