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 的 ModelProviders 在模型方面或多或少会完全重写,提供一些灵活性。任何依赖模型事件、存储、记录等的代码都需要重写。

于 2012-11-22T06:03:14.007 回答
2

那么问题在于 GXTBaseModel和 GWT-RPC 序列化的实现。BaseModel 基于特殊的 GXT 地图 RpcMap。这个 map 定义了特殊的序列化规则,可以避免 RPC 类型爆炸,但是作为副作用,只有一些存储在 map 中的简单类型会被序列化。例如,您可以将任何类型放入映射中,但是如果您对其进行序列化/反序列化,则只会出现 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 回答