我创建了一个非常基本的应用程序。我只有一个服务类和一个对应的Async类,它只包含Java类型而没有自定义类。但我仍然得到序列化异常。
我的服务类看起来像这样。
public interface MyService extends RemoteService {
public String getName();
public Object getAdditionalDetials(ArrayList<String> ids);
public Date getJoiningDate();
}
我的异步界面如下所示
public interface MyServiceAsync {
public void getName(AsyncCallback<String> callback);
public void getAdditionalDetials(ArrayList<String> ids, AsyncCallback<Object> callback);
public void getJoiningDate(AsyncCallback<Date> callback);
}
我知道我犯了一些愚蠢的错误。
答案 0 :(得分:1)
我在gwt rpc和序列化机制中很天真,但会尝试回答你的问题。
每当你编写涉及RPC的类时,GWT都会创建一个Serialization Policy File
。序列化策略文件包含可以序列化的允许类型的白名单。
在您的服务方法中,如果提及IsSerializable
,您提及和引用的所有类型都将自动添加到此列表中。在您的情况下,您使用了以下两种方法,
public String getName();
public Date getJoiningDate();
您已使用String
和Date
作为退货类型,因此会将其添加到Serialization Policy File
。但是在下面的方法中,它们存在问题,
public Object getAdditionalDetials(Arraylist<String> ids);
在这里您使用了ArrayList and String
这不是问题而且它们会被添加到您的白名单中,但问题是您提到的返回类型为Object
。这里GWT编译器不知道要添加到whitelist or Serialization Policy
的类型,因此它不会通过您的RPC调用。解决方案是使用提及实现IsSerializable
的类而不是提及类型Object
的返回类型。
答案 1 :(得分:0)
FWIW,我遇到了这个问题,但我的“对象”类型隐藏在一般化的类之后。
因此,如果你的一个rpc方法涉及一个类:
class Xxx<T> implements IsSerializable {...
需要更改为:
class Xxx<T extends IsSerializable> implements IsSerializable {...