web-dev-qa-db-ja.com

GWT-RPC SerializationException

私がGWTを行って久しぶりに、何か小さなことをすばやく行う必要がありました。私は物事をセットアップし、今必要なRPCがありますが、失敗します。

RPCは私にArrayListを提供することになっており、Vacancyは#projectname#.client.modelにあります。呼び出しは#projectname#.client.modelで行われます。
サービスのインターフェイスは#project#name.client.Serviceにあります。
最後に、もちろん、呼び出しは#projectname#.serverに行きます。
VacancyはIsSerializableを実装しています。 RPCの実行で発生する例外は次のとおりです。

Starting Jetty on port 8888
[WARN] Exception while dispatching incoming RPC call
com.google.gwt.user.client.rpc.SerializationException: Type 'firsteight.client.model.Vacancy' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = firsteight.client.model.Vacancy@15fdd2f
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.Java:619)
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.Java:126)
    at com.google.gwt.user.client.rpc.core.Java.util.Collection_CustomFieldSerializerBase.serialize(Collection_CustomFieldSerializerBase.Java:44)
    at com.google.gwt.user.client.rpc.core.Java.util.ArrayList_CustomFieldSerializer.serialize(ArrayList_CustomFieldSerializer.Java:39)
    at com.google.gwt.user.client.rpc.core.Java.util.ArrayList_CustomFieldSerializer.serializeInstance(ArrayList_CustomFieldSerializer.Java:51)
    at com.google.gwt.user.client.rpc.core.Java.util.ArrayList_CustomFieldSerializer.serializeInstance(ArrayList_CustomFieldSerializer.Java:28)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.Java:740)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.Java:621)
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.Java:126)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.Java:153)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.Java:539)
    at com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.Java:616)
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.Java:474)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.Java:571)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.Java:208)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.Java:248)
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.Java:62)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.Java:487)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.Java:362)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.Java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.Java:181)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.Java:729)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.Java:405)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.Java:152)
    at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.Java:49)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.Java:152)
    at org.mortbay.jetty.Server.handle(Server.Java:324)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.Java:505)
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.Java:843)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.Java:647)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.Java:211)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.Java:380)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.Java:395)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.Java:488)

私が作成するRPCは次のとおりです。

void getVacs() {
    try {
        homeService.getVacancies(new AsyncCallback<ArrayList<Vacancy>>() {
            public void onFailure(Throwable caught)
            {
                RootPanel.get("grayblock").add(new HTML("Failed:" + caught.getMessage()));
            }

            public void onSuccess(ArrayList<Vacancy> result)
            {
                RootPanel.get("grayblock").add(new HTML(result.get(0).getTitle()));
            }
        });
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

私は、VacancyをSerializableにするために必要なすべてを実行したと思いました。RPCの戻り型としてのVacancyのArrayListは、戻り型としてVacancyを持っていると数えます。何が悪いのですか?

前もって感謝します!

15
Mark Tielemans

これは通常、シリアライズ不可能なクラスを使用しているために発生します。これは、クラスがcom.google.gwt.user.client.rpc.IsSerializableを実装していない場合や、空のコンストラクターを追加するのを忘れた場合に発生する可能性があります。

Beanを渡すには、次の要件を満たす必要があります(GWTサイトから)。

  1. Java SerializableまたはGWT IsSerializableインターフェイスのいずれかを直接実装するか、実装するスーパークラスから派生するためです。
  2. 最終ではなく、一時的でないインスタンスフィールド自体がシリアライズ可能です
  3. デフォルト(ゼロ引数)コンストラクターにアクセス修飾子が含まれている(たとえば、プライベートFoo(){}が機能する)

これらの要件を満たしている場合でも、GWTコンパイラは次のように言うことがあります。

このSerializationPolicyによってシリアル化できるタイプのセットに含まれていないか、そのClassオブジェクトをロードできませんでした。セキュリティ上の理由から、このタイプはシリアル化されません。:インスタンス= @

問題にはさまざまな原因が考えられます。ここに彼が問題を解決するために使用する完全なチェックリスト:

  1. クラスにデフォルトのコンストラクター(引数なし)があることを確認します。
  2. クラスがSerializableまたはIsSerializableを実装するか、Serializableを拡張する、またはSerializableを実装するクラスを拡張するインターフェイスを実装することを確認します。
  3. クラスがclient。*パッケージまたは…にあることを確認してください
  4. クラスがclient。*パッケージにない場合は、GWT xmlモジュール定義でコンパイルされていることを確認してください。デフォルトでは存在します。クラスが別のパッケージにある場合は、ソースに追加する必要があります。たとえば、クラスがdomain。*の下にある場合、それをxmlにとして追加する必要があります。クラスはサーバーパッケージに属することができないことに注意してください! GWTページの詳細: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideModuleXml
  5. 別のGWTプロジェクトからのクラスを含める場合は、xmlモジュール定義に継承を追加する必要があります。たとえば、クラスFooがパッケージcom.dummy.domainにある場合は、モジュール定義に追加する必要があります。詳細はこちら: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideInheritingModules
  6. Jarとしてリリースされた別のGWTプロジェクトのクラスを含める場合は、GWTがクライアントに渡されるクラスのJavaソースも再コンパイルするため、jarにソースコードも含まれていることを確認してください。

PS: http://isolaso​​ftware.it/2011/03/22/gwt-serialization-policy-error/ からコピーしました。サイトが現在利用できないためです。元の記事を読みたい場合は、上記のURLを使用してGoogleから検索し、Google Webキャッシュから読み取ります。

32
Õzbek

この例外のもう1つの理由は、ブラウザー側の古いJavaScriptでした。コードをハードリロード(CTRL + F5)しなければならず、この例外はなくなりました。

7
Cipous

Cipousが述べたように、私の場合、Pentaho BI Serverのサーバー出力でこの例外がスローされました。単純なハードリロード(CTRL + F5)でうまくいきました。

0
Marouane Misdak

まず最初に、必ず空のコンストラクタを定義してください。
そうでない場合、クラスはシリアル化できません...

空のコンストラクターがある場合は、クラス(または拡張チェーン内の任意のクラス)implements IsSerializable(またはIsSerialisableを拡張するその他のインターフェイス)を確認してください

クラスがIsSerialisableを実装している場合は、それがnon-final ...であることを確認してください。

0
balt

サブリストを使用したときにもこのエラーが発生します。

return myList.subList(fromIndex, toIndex);
0
paka

私の場合、targetフォルダに古いキャッシュがあり、適切に更新されていません。プロジェクトを再構築する必要があり(Maven-> Update Project)、それが機能しました。

0
xji