我有一个使用以下方法的 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/