java - gwt - 在 RPC 调用中使用 List<Serializable>?

标签 java gwt serialization rpc gwt-rpc

我有一个使用以下方法的 RPC 服务:

public List<Serializable> myMethod(TransactionCall call) {...}

但是我在分析这个方法的时候得到一个警告,然后rpc调用失败

Analyzing 'my.project.package.myService' for serializable types
Analyzing methods:
public abstract java.util.List<java.io.Serializable> myMethod(my.project.package.TransactionCall call)
Return type: java.util.List<java.io.Serializable>
[...]
java.io.Serializable
Verifying instantiability
(!) Checking all subtypes of Object which qualify for serialization

似乎我不能为我的 List 使用 Serializable...我可以使用我自己的接口(interface)(类似于 AsyncDataInterface,它实现了 Serializable 接口(interface))但事实是我的方法将返回一个列表自定义对象和基本对象(例如字符串、整数....)。

所以我的问题是:

  • 这是一种标准行为吗? (我不明白为什么在那种情况下我不能使用这个接口(interface))
  • 有人有解决这种情况的方法吗?

最佳答案

当通过 RPC 调用传递对象时,最好在 RPC 接口(interface)中声明具体的参数类型。如果由于某种原因您不能在 RPC 接口(interface)中使用具体类,请尝试尽可能具体。

这是因为 GWT 编译器在生成 javascript 时必须考虑编译单元中 List 的所有可能变体。这包括在类路径中扩展 List 和 Serializable 接口(interface)的所有类。排列可能很大,这会影响您的编译时间和应用程序下载大小。

所以最好的方法是将你的接口(interface)定义为

public ArrayList<YourType> myMethod(TransactionCall call) {...}

而不是

public List<Serializable> myMethod(TransactionCall call) {...}

这样编译器必须只为 ArrayList 和 YourType 扩展生成编译单元。好处是编译时间更快,编译后的 javascript 文件更小,因此应用程序下载速度更快。

如果您必须在 RPC 调用中返回范围广泛的不相关对象,请尝试创建一个包装类并返回包装类的返回值包装的对象。在 RPC 方法定义中使用包装类。抵制将包装字段声明为 Object 或 Serializable 的冲动,您将抵消使用包装器获得的所有序列化优势。相反,您可以为希望通过 RPC 调用返回的每个具体类型定义一个 Wrapper 接口(interface)和一小组 Wrapper 实现。

关于java - gwt - 在 RPC 调用中使用 List<Serializable>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3059787/

相关文章:

java - Spring Boot 希望@Component 类成为@Configuration 类中的@Bean

java - 无法使用Java中的参数化构造方法实例化对象

java - Method 和 Constructor<?> 都继承自 Member,都具有 getExceptionTypes() 方法。在这种情况下如何避免代码重复?

java - 没有 GWTquery 函数正在运行

java - 如果我从泛型类派生非泛型类,类型会发生什么情况?

java - 无法向 iOs 设备发送通知

GWT 动态语言环境

java - GWT 事件 : what am i missing?

javascript - 如何使用 postMessage 作为序列化程序来隔离消息?

c# - 为什么即使在转换其父类之后,Web API Action 方法也会返回子属性的 Json