另外我发现服务接口之间没有共享序列化程序,我的意思是如果我在2个rpc服务接口上引用了例如AccountDTO类型,我会得到2个序列化程序类而不是同一类型的1.
为了减少编译代码的大小,我想也许我可以使用Deferred Binding来替换我拥有的一个大接口的所有服务接口.如果可能,那么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> ... ...
但此刻我收到了错误:
[ERROR]’file:/ C:/Users/Daniel/EclipseWorkspace/ADK/src/com/arballon/gwt/core/client/FinancialService.java’中的错误
[错误]第31行:无法找到重新绑定结果’com.arballon.gwt.core.client.GenericService’
任何有关该问题的想法将不胜感激.
问候
丹尼尔
GWT的RPC生成代码构建了几个类来完成它的工作,正如您所指出的那样:每个类型的* _FieldSerializer遍历线路,以及RemoteService异步类型的* _Proxy类.那个代理类型需要一个* _TypeSerializer,它是你问题的根源 – 由于某些原因,GWT连接了一个string-> js函数映射中的所有序列化/反序列化方法,可能有助于快速查找 – 但是这个设置代码代价是需要在最终构建中的代码行.一种更优化的方法可以让每个FieldSerializer都有一个注册方法,它将其方法添加到Proxy所拥有的静态映射中 – 然而,这是困扰,但是GWT优化了尝试不引用instantiate(),反序列化()和序列化( )方法如果没有出现它们将被调用.您的问题源于可以序列化的许多类型,以及您尝试构建每个描述特定功能单元但重复使用许多模型类型的RemoteService类型.令人钦佩的目标,特别是因为它可能会使您的服务器端代码看起来更好,但显然GWT会让您感到厌烦.
我试图在freenode上提供的解决方案(如niloc132)是构建一个名为GeneralService的大型RemoteService类型,以及一个匹配的GeneralServiceAsync,每个类型都扩展了所有现有的rpc服务类型.我的第一个想法是使用< replace-with>告诉生成器系统当你希望每个RemoteService类型用GeneralService替换它时,但正如Tahir指出的那样,这没有意义 – GWT不会将重新绑定结果传回自身以继续进行查找.相反,我建议您在需要服务异步类型时,执行以下操作:
AccountingServiceAsync service = (AccountingServiceAsync) GWT.create(GeneralService.class)
来自GeneralService的重新绑定结果将实现GeneralServiceAsync,它本身可分配给AccountingServiceAsync.如果内存服务,则表示您具有提供这些服务的静态方法/字段 – 将这些站点更改为始终创建GeneralServiceAsync实例.只要不在任何RemoteService子类型上调用GWT.create而是在GeneralService上调用GWT.create,就会将TypeSerializers的数量限制为一个.
作为旁注,RemoteServiceProxy子类型是无状态的,因此确保只创建一个实例可能会使一致构建更容易,但不会节省运行时内存或时间,因为它们几乎肯定会编译为静态方法.但是,* _TypeSerializer类确实具有状态,但每个类只有一个实例,因此组合所有RemoteServices可能会节省很少的工作内存.