第二次编译相同的源文件产生不同的gwt.rpc文件集

问题描述:

我想跟进这个问题gwt-serialization-policy-hosted-mode-out-of-sync。简而言之 - 当我从托管浏览器执行RPC时,此调用会在服务器上失败,并发生异常。第二次编译相同的源文件产生不同的gwt.rpc文件集

INFO: GwtRpcEventSrvc: ERROR: The serialization policy file '/84EC7BA65AF8175BAA99B47877FDE163.gwt.rpc' was not found; did you forget to include it in this deployment? 
    SEVERE: GwtRpcEventSrvc: WARNING: Failed to get the SerializationPolicy '84EC7BA65AF8175BAA99B47877FDE163' for module 'http://host:19980/MYAPP/'; a legacy, 1.3.3 compatible, serialization policy will be used. Youmay experience SerializationExceptions as a result. 
    SEVERE: Exception while dispatching incoming RPC call 

虽然当我从浏览器执行相同的RPC时,请求在服务器上成功执行。

此外,我观察到GWT编译器的一个奇怪行为,可能导致托管浏览器模式的问题。

我假设当我做两个后续的完全相同的代码编译,那么单个编译的结果应该是相同的。我的意思是至少xxxxx.html和yyyyy.gwt.rpc文件必须相同。 (其中xxxxx和yyyyy是诸如84EC7BA65AF8175BAA99B47877FDE163的长数字。)

目前我有两个版本的我的项目。

  • 的旧项目由GWT编译1.7不从问题中gwt-serialization-policy-hosted-mode-out-of-sync
  • 一个新的项目中描述的托管浏览器是由GWT编译2.0.4遭遇。这个新项目是基于旧项目。此项目遭受托管的浏览器问题。

案例1:老项目与GWT 1.7

我带着我的,是由GWT编译1.7旧项目。我做了两个编译,我比较了编译的工件。 gwt.rpc文件相同html文件有不同的内容和名称。由于gwt.rpc文件是相同的,我没有托管浏览器的问题。

案例2:与GWT 2.0.4

我编了两遍,都gwt.rpc和html文件的新项目是不同的。因此,托管浏览器中的RPC调用由于缺少gwt.rpc文件而在服务器上失败。

案例3:老项目,GWT 2.0.4

我编了两遍,都gwt.rpc和html文件是不同的。因此,托管浏览器中的RPC调用由于缺少gwt.rpc文件而在服务器上失败。

我做了一些调查,并确定当我注释掉一个类中的数据成员从服务器传输到客户端的数据,然后编译的文件开始相同。

class Data implements IsSerializable { 
      List<IsSerializable> data; 
      ... 
    } 
  1. 我想做同样的事情,在新的项目,但它似乎有很多类进行修改。因此,随着项目的增长,问题在增加。
  2. 我不知道用什么来代替

    List<IsSerializable> data; 
    

    来传输数据。

您需要了解更多一些的GWT序列化政策:

Serializable Types

通常你不.rpc文件混在一起,除非你正在做先进RPC调用,直接到你的服务器。

您的序列化对象:

class Data implements IsSerializable { 
     List<IsSerializable> data; 
     ... 
} 

用户定义类是可序列化的,如果所有的下列规定: 这是分配给IsSerializable或序列化,可能是因为它直接实现这些接口中的一个或因为它来自一个超类,所有非最终的,非暂时的实例字段本身都是可序列化的,并且从GWT 1.5开始,它必须有一个默认的(零参数)构造函数(带有任何访问修饰符)或者没有构造函数所有。

所以,你应该有类似:

class Data implements IsSerializable { 
     List<YOUR_TYPE> data; 
     ... 
} 

你的列表的模板类型,您没有设置“IsSerializable” ...它应该是这样的:

List<int> data;