Gwt 进行RPC调用时出现序列化异常

Gwt 进行RPC调用时出现序列化异常,gwt,gwt-2.5,Gwt,Gwt 2.5,我创建了一个非常基本的应用程序。我只有一个服务类和一个相应的异步类,它只包含Java类型,没有自定义类。但我仍然得到了序列化异常 我的服务课是这样的 public interface MyService extends RemoteService { public String getName(); public Object getAdditionalDetials(ArrayList<String> ids); public Date getJoiningDate()

我创建了一个非常基本的应用程序。我只有一个服务类和一个相应的异步类,它只包含Java类型,没有自定义类。但我仍然得到了序列化异常

我的服务课是这样的

public interface MyService extends RemoteService {
  public String getName();
  public Object getAdditionalDetials(ArrayList<String> ids);
  public Date getJoiningDate();
}
公共接口MyService扩展了RemoteService{
公共字符串getName();
公共对象getAdditionalDetials(ArrayList ID);
公共日期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);
}
公共接口MyServiceAsync{
public void getName(异步回调);
public void getAdditionalDetials(ArrayList ID、AsyncCallback);
public void getJoiningDate(异步回调);
}

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

我对gwt rpc和序列化机制很幼稚,但我会尝试回答你的问题

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

在您的服务方法中,您提到和引用的所有类型都将自动添加到此列表中(如果它们实现)。在您的案例中,您使用了以下两种方法:

public String getName();
public Date getJoiningDate();
这里您使用了
字符串
日期
作为返回类型,因此它被添加到
序列化策略文件
。但在下面的方法中,他们存在一个问题

public Object getAdditionalDetials(Arraylist<String> ids);
公共对象getAdditionalDetials(Arraylist ID);

这里您使用了
ArrayList和String
,这不是问题,它们将被添加到您的白名单中,但问题是您提到的返回类型是
Object
。在这里,GWT编译器不知道要添加到
白名单或序列化策略中的类型,因此它不会通过您的RPC调用。解决方案是使用一个实现的类,而不是使用类型
对象的返回类型

我对gwt rpc和序列化机制不太了解,但会尝试回答您的问题

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

在您的服务方法中,您提到和引用的所有类型都将自动添加到此列表中(如果它们实现)。在您的案例中,您使用了以下两种方法:

public String getName();
public Date getJoiningDate();
这里您使用了
字符串
日期
作为返回类型,因此它被添加到
序列化策略文件
。但在下面的方法中,他们存在一个问题

public Object getAdditionalDetials(Arraylist<String> ids);
公共对象getAdditionalDetials(Arraylist ID);

这里您使用了
ArrayList和String
,这不是问题,它们将被添加到您的白名单中,但问题是您提到的返回类型是
Object
。在这里,GWT编译器不知道要添加到
白名单或序列化策略中的类型,因此它不会通过您的RPC调用。解决方案是使用提及一个实现的类,而不是提及类型
Object

FWIW的返回类型。我遇到了这个问题,但我的“Object”类型隐藏在泛型类之后

因此,如果您的某个rpc方法涉及一个类:

class Xxx<T> implements IsSerializable {...
类Xxx实现了IsSerializable{code>。。。
它需要改为:

class Xxx<T extends IsSerializable> implements IsSerializable {...
类Xxx实现了IsSerializable{code>。。。
FWIW,我遇到了这个问题,但是我的“对象”类型被隐藏在泛型类后面

因此,如果您的某个rpc方法涉及一个类:

class Xxx<T> implements IsSerializable {...
类Xxx实现了IsSerializable{code>。。。
它需要改为:

class Xxx<T extends IsSerializable> implements IsSerializable {...
类Xxx实现了IsSerializable{code>。。。