进行RPC调用时的序列化异常

时间:2013-01-13 12:02:01

标签: gwt gwt-2.5

我创建了一个非常基本的应用程序。我只有一个服务类和一个对应的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);
}

我知道我犯了一些愚蠢的错误。

2 个答案:

答案 0 :(得分:1)

我在gwt rpc和序列化机制中很天真,但会尝试回答你的问题。

每当你编写涉及RPC的类时,GWT都会创建一个Serialization Policy File。序列化策略文件包含可以序列化的允许类型的白名单。

在您的服务方法中,如果提及IsSerializable,您提及和引用的所有类型都将自动添加到此列表中。在您的情况下,您使用了以下两种方法,

public String getName();
public Date getJoiningDate();

您已使用StringDate作为退货类型,因此会将其添加到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 {...