0

私はGWTに非常に慣れていません。ext-gwt ウィジェットを使用しています。

オフィスのコードに、

class A extends BaseModel{

 private UserAccountDetailsDto userAccountDetailsDto = null;

 //SETTER & GETTER IN BASEMODEL WAY
}

また、DTO 参照は使用されません。

public class UserAccountDetailsDto implements Serializable{

    private Long userId=null;
    private String userName=null;
    private String userAccount=null;
    private String userPermissions=null;

        //NORMAL SETTER & GETTER
}

これで、GWT サーバー側コードから結果を取得でき、問題なく動作しますが、クラス A 内の DTO 参照にコメントすると、結果が得られません。

その必要性を説明してください。

ありがとう

4

2 に答える 2

2

BaseModelを使用してGXT2アプリケーションコードをGXT3モデルに移植するのは困難な作業です。GXT3のModelProviderを使用してモデル側でほぼ完全に書き直し、ある程度の柔軟性を提供します。モデルのイベント、保存、記録などに依存するコードはすべて、書き直しの対象になります。

于 2012-11-22T06:03:14.007 に答える
2

問題は、GXTBaseModelおよび GWT-RPC シリアライゼーションの実装にあります。BaseModel は、特殊な GXT マップである RpcMap に基づいています。このマップには特別なシリアライゼーション ルールが定義されているため、RPC タイプの爆発を回避できますが、副作用として、マップに格納されている一部の単純なタイプのみがシリアライズされます。たとえば、マップ内に任意の型を配置できますが、それをシリアライズ/デシリアライズすると、Integer、String、Double、Byte、Float、Short 型 (およびこの型の配列) の値のみが存在します。したがって、BaseModel 内に DTO への参照を置くことの背後にある意味は、この型もシリアル化する必要があることを GWT-RPC に伝えることです。

詳細な説明

基本的に、GWT-RPC は次のように機能します。

サービスのインターフェースを定義すると、GWT-RPC はパラメーター/戻り値の型で使用されるすべてのクラスを分析して、シリアライザー/デシリアライザーを作成します。サービスからのようなものを返す場合Map<Object,Object>、GWT-RPC は Map および Serializable インターフェイスを実装するクラスごとにシリアライザーを作成する必要がありますが、Serializable を実装するクラスごとにシリアライザーも生成します。最終的には、コンパイルされた js ファイルのサイズがはるかに大きくなるため、これは非常に悪い状況です。この状況は、GWT-RPC タイプの爆発と呼ばれます。

したがって、 ではBaseModel、すべての値が に格納されRpcMapます。またRpcMap、カスタムで作成されたシリアライザー (RpcMap_CustomFieldSerializerそのようなものを作成する方法に興味がある場合は、そのコードを見ることができます) があるため、上記の問題は発生しません。しかし、カスタム シリアライザーがあるため、GWT は、どのカスタム クラスが に配置されているかを認識RpcMapせず、それらのシリアライザーを生成しません。したがって、クラスにフィールドを入れるBaseModelと、gwt はこのクラスをシリアル化する必要があることを認識し、このクラスに必要なものをすべて生成します。

于 2012-08-17T08:38:46.830 に答える