如何从GWT的序列化策略中删除实现类型?

与此问题相反: 如何向GWT的序列化策略白名单添加类型?

GWT正在向序列化策略添加不需要的类型并使我的JS膨胀。 如何手动修剪我的GWT白名单? 或者我应该呢?

例如,如果我将接口List放在GWT RPC服务类上,GWT必须生成处理ArrayList,LinkedList,Stack,Vector等的Javascript,即使我的团队知道我们只会返回一个ArrayList。 我可以让方法的返回类型为ArrayList,但我喜欢依赖于接口而不是特定的实现。 毕竟,也许有一天我们会将其切换并返回例如LinkedList。 在这种情况下,我想强制GWT序列化策略仅针对ArrayList和LinkedList进行编译。 没有堆栈或向量。

这些隐含的限制有一个我能想到的巨大缺点:团队的新成员开始返回Vectors,这将是一个运行时错误。 所以除了标题中的问题,你围绕这个设计的经验是什么?

有一个属性可以将此类列入黑名单。 例如,要将非ArrayList集合列入黑名单,请将这些行添加到* .gwt.xml:

       

当我通过网络发送GWT的内置com.google.gwt.user.client.ui.SuggestOracle$Response对象时,这对我来说是必要的。 这些对象包含java.util.Collection,但我知道我只会发回一个ArrayList。

我仍然尊重编译时检查的优点,正如其他回复,评论和我原来的问题所讨论的那样。 实际上,如果GWT开始采用序列化的其他实现(为什么这不是白名单?),这是一个片状解决方案。 然而,这个“rpc.blacklist”属性使我免于滚动我自己的SuggestOracle以获得更具体的集合类型。

虽然没有好的框架应该尝试改变其用户,但让我试着解释为什么GWT序列化的工作方式。 我不知道这个的确切机制,所以我可能错了,但这是我所看到的要点。

GWT已经删除了RPC接口之外的额外代码 – 例如,如果您使用没有RPC的应用程序,您可以自由使用List和Map等接口并设置为您的内容 – GWT将自动仅包含您实际的实现使用。 为什么? 因为它可以访问您的代码,并且能够实际遍历代码的所有可见排列并修剪未使用的类。 因此,当使用接口时,GWT实际上不会创建类爆炸。

问题完全是RPC。 RPC服务的要点是服务器需要实现一个RPC接口 – 这意味着如果接口指示一个方法需要返回一个列表,那么服务器可以自由地返回它想要的列表的任何实现,只要因为它可以序列化。

这就是问题 – GWT绝对无法知道服务器将在编译时或将来的某个时刻使用什么接口。 服务器代码可以并且在许多情况下将独立于客户端代码进行开发。 因此,通过线路安全地接收List类型对象的唯一方法是事先了解它的每个可能的实现。