gpt4 book ai didi

GWT 如何减少 RPC 调用的代码序列化器的大小

转载 作者:行者123 更新时间:2023-12-02 18:13:51 24 4
gpt4 key购买 nike

我发现 GWT 在我的应用程序上生成的 javaScript 代码中有超过 60% 用于 RPC 序列化器。我还发现序列化程序不在服务接口(interface)之间共享,我的意思是,如果我在 2 个 rpc 服务接口(interface)上引用了 AccountDTO 类型,我将获得 2 个序列化程序类,而不是 1 个相同类型的序列化程序类。为了减少编译代码的大小,我想也许我可以使用延迟绑定(bind)来替换一个大接口(interface)的所有服务接口(interface)。如果可能的话,也许 GWTCompiler 将只生成一个 AccountDTO 序列化程序,而不是 2 个。

我不确定这是一个好主意,或者是否有更好的解决方案来解决我的问题。

我试图实现的是这样的:

// Define new interface that extends all service interfaces
public interface GenericService extends RemoteService,
AccountingService,
FinancialService,..., { }

public interface GenericServiceAsync extends AccountingServiceAsync,
FinancialServiceAsync, ..., { }

// At Application.gwt.xml do:

<module>
...
...
<replace-with class="com.arballon.gwt.core.client.GenericService">
<when-this-is class="com.arballon.gwt.core.client.AccountingService>
</replace-with>
<replace-with class="com.arballon.gwt.core.client.GenericService">
<when-this-is class="com.arballon.gwt.core.client.FinancialService>
</replace-with>
...
...

但此刻我收到错误:

[错误]“文件:/C:/Users/Daniel/EclipseWorkspace/ADK/src/com/arballon/gwt/core/client/FinancialService.java”中的错误 [错误]第31行:无法找到重新绑定(bind)结果“com.arballon.gwt.core.client.GenericService”

有关此问题的任何想法将不胜感激。问候

丹尼尔

最佳答案

GWT 的 RPC 生成代码构建了几个类来完成其工作,正如您所注意到的:a *_FieldSerializer对于通过网络传输的每种类型,以及 *_Proxy RemoteService 异步类型的类。该代理类型需要 *_TypeSerializer ,这是问题的根源 - 出于某种原因,GWT 将所有序列化/反序列化方法连接到 string->js 函数映射中,可能是为了促进快速查找 - 但此设置代码是以代码行为代价的这需要在最终版本中。更优化的方法可以将每个FieldSerializer有一个注册方法,它将其方法添加到代理拥有的静态映射中 - 然而,这受到了困扰,但 GWT 的优化尝试不引用 instantiate() , deserialize()serialize()如果没有出现,它们将被调用。

您的问题源于有许多可以序列化的类型,以及您尝试构建 RemoteService每个类型都描述特定的功能单元,但重复使用许多模型类型。令人钦佩的目标,特别是因为它可能会让您的服务器端代码看起来更好,但显然 GWT 会因此而困扰您。

我试图在 freenode(如 niloc132)上为您提供的解决方案是构建一个大型 RemoteService类型,您将其命名为 GeneralService ,以及匹配的GeneralServiceAsync ,每个都扩展了所有现有的 RPC 服务类型。我的第一个想法是使用 <replace-with>告诉生成器系统,当您希望每个 RemoteService 类型将其替换为 GeneralService 时,但正如 Tahir 指出的那样,这没有意义 - GWT 不会将重新绑定(bind)结果传递回自身以继续进行查找。相反,我建议当您需要服务异步类型时,请执行以下操作:

AccountingServiceAsync service = (AccountingServiceAsync) GWT.create(GeneralService.class)

来自GeneralService的重新绑定(bind)结果将实现GeneralServiceAsync ,它本身可分配给 AccountingServiceAsync 。如果没记错的话,您说过您有提供这些服务的静态方法/字段 - 更改这些站点以始终创建 GeneralServiceAsync实例。只要您不调用 GWT.create任何 RemoteService子类型但是GeneralService ,您将限制 TypeSerializers 的数量到一。

作为旁注,RemoteServiceProxy子类型是无状态的,因此确保只创建一个实例可能会更容易一致地构建,但不会节省运行时内存或时间,因为它们几乎肯定会编译为静态方法。 *_TypeSerializer然而,类确实有状态,但每个类只有一个实例,因此将所有 RemoteService 结合起来。 s 可能会节省很少量的工作内存。

关于GWT 如何减少 RPC 调用的代码序列化器的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6778664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com