对相同源代码的第二次编译将生成不同的gwt.rpc文件集

对相同源代码的第二次编译将生成不同的gwt.rpc文件集,gwt,collections,compilation,Gwt,Collections,Compilation,我想跟进这个问题。简言之,当我从托管浏览器执行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: WARNI

我想跟进这个问题。简言之,当我从托管浏览器执行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和yyyy.gwt.rpc文件必须相同。(其中xxxxx和yyyy是长数字,如84EC7BA65AF8175BAA99B4777FDE163。)

目前我有两个版本的项目

  • 一个由GWT1.7编译的旧项目,它不会遇到中所述的托管浏览器问题
  • 由GWT2.0.4编译的新项目。这个新项目是以旧项目为基础的。此项目存在托管浏览器问题
案例1:使用GWT 1.7的旧项目

我接受了由GWT1.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;
           ...
    }
类数据实现可序列化{
列出数据;
...
}
  • 我想在新项目中做同样的事情,但似乎有很多类需要修改。因此,随着项目的发展,问题也越来越严重
  • 我不知道用什么来代替它

    List<IsSerializable> data;
    
    列表数据;
    
    传输数据


  • 您需要阅读更多有关GWT序列化策略的内容:

    通常,除非您直接对服务器执行高级rpc调用,否则您不会与.rpc文件混合

    您的可序列化对象:

    class Data implements IsSerializable {
          List<IsSerializable> data;
           ...
    }
    
    类数据实现可序列化{
    列出数据;
    ...
    }
    
    如果以下所有条件均适用,则用户定义的类是可序列化的: 它可以分配给IsSerializable或Serializable,这是因为它直接实现了这些接口中的一个,或者是因为它派生自一个实现这些接口的超类 所有非最终、非临时实例字段本身都是可序列化的,并且 从GWT1.5开始,它必须有一个默认(零参数)构造函数(带有任何访问修饰符),或者根本没有构造函数

    因此,您可能应该有如下内容:

    class Data implements IsSerializable {
          List<YOUR_TYPE> data;
           ...
    }
    
    类数据实现可序列化{
    列出数据;
    ...
    }
    
    您的列表模板是一种类型,您没有设置“IsSerializable”。。。应该是这样的:

    List<int> data;
    
    列表数据;