1

GWT の RPC メカニズムで使用するシリアライズ可能なオブジェクトがいくつかあります。「id」、「revision」などの共通フィールドを含むオブジェクトをすべてサブクラスにすることにしました。ただし、GWT はスーパークラスのフィールドをシリアル化しないことに気付いたので、すべてのスーパークラスを取得するだけです。クライアント側でクラス フィールドを null にします。

Serializable クラスごとに CustomFieldSerializer を作成することなく、スーパークラス フィールドをシリアル化するにはどうすればよいですか? 出来ますか?

例:

public class Super {
    private String id;

    public String getId() {
        return id;
    }

}

public class Sub extends Super implements Serializable {
    private String name;

    // more stuff here
}


// on the client side, inside an AsyncCallback
onSuccess(Sub sub) {
    assert(sub.getId() != null);
}

したがって、これを GWT の RPC メカニズムを介してクライアント側に送信すると、Sub のインスタンスの「id」フィールドに null 値が返されます。サーバーで id が null でないことを確認しました。また、スーパークラスに Serializable を実装しようとしましたが、運が悪かったです。

どんなアドバイスでも大歓迎です。

4

2 に答える 2

1

gwt で任意のクラスをシリアル化するには、スーパー クラスで Serializable を実装する必要があります。

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

1. Java Serializable または GWT IsSerializable インターフェイスを直接実装するか、実装するスーパークラスから派生するため実装します。

2.その非最終的で非一時的なインスタンスフィールドは、それ自体がシリアライズ可能です

3.アクセス修飾子を備えたデフォルト(引数なし)のコンストラクターがあります(たとえば、private Foo(){}が機能します)

問題にはさまざまな原因が考えられます。

1.クラスにデフォルトのコンストラクターがあることを確認します(引数なし)

2. クラスが Serializable または IsSerializable を実装するか、Serializable を拡張する Interface を実装するか、Serializable を実装するクラスを拡張することを確認します。

3. クラスが client.* パッケージまたは … にあることを確認します。</p>

4. クラスが client.* パッケージに含まれていない場合は、GWT xml モジュール定義でコンパイルされていることを確認します。デフォルトでは存在します。クラスが別のパッケージにある場合は、それをソースに追加する必要があります。たとえば、クラスが domain.* の下にある場合は、xml に として追加する必要があります。クラスはサーバー パッケージに属することができないことに注意してください。

5. 別の GWT プロジェクトのクラスを含める場合は、xml モジュール定義に継承を追加する必要があります。たとえば、クラス Foo がパッケージ com.dummy.domain にある場合、モジュール定義に追加する必要があります。

6. jar としてリリースされた別の GWT プロジェクトのクラスを含める場合、GWT はクライアントに渡されたクラスの Java ソースも再コンパイルするため、jar にソース コードも含まれていることを確認します。

于 2012-05-04T09:47:00.047 に答える
0

Super のデータをシリアライズする場合は、シリアライズ可能にする必要があります。

于 2012-05-04T21:25:43.040 に答える