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

Gar*_*gos 14 java gwt serialization rpc gwt-rpc

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

public List<Serializable> myMethod(TransactionCall call) {...}
Run Code Online (Sandbox Code Playgroud)

但是在分析此方法时我收到警告,然后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 wich qualify for serialization
Run Code Online (Sandbox Code Playgroud)

似乎我不能将Serializable用于我的List ...我可以使用我自己的界面(类似于AsyncDataInterface,它实现了Serializable接口),但事实是我的方法将返回一个列表自定义对象和基本对象(如as Strings,int ....).

所以我的问题是:

  • 这是一种标准行为吗?(我无法弄清楚为什么我不能在这种情况下使用这个界面)
  • 有没有人有针对这种情况的解决方法?

Ash*_*bhu 29

在RPC调用中传递对象时,最好在RPC接口中声明具体的参数类型.如果由于某种原因您无法在RPC接口中使用具体类,请尝试尽可能具体.

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

因此,最好的方法是将您的界面定义为

public ArrayList<YourType> myMethod(TransactionCall call) {...}
Run Code Online (Sandbox Code Playgroud)

而不是

public List<Serializable> myMethod(TransactionCall call) {...}
Run Code Online (Sandbox Code Playgroud)

这样编译器只需为ArrayList和YourType扩展生成编译单元.好处是编译时间更短,编译的javascript文件更小,从而加快了应用程序的下载速度.

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