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

时间:2011-11-25 14:30:01

标签: gwt collections compilation

我想跟进这个问题gwt-serialization-policy-hosted-mode-out-of-sync。简而言之 - 当我从托管浏览器执行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文件都不同。因此,由于缺少gwt.rpc文件,托管浏览器中的RPC调用在服务器上失败。

案例3:使用GWT 2.0.4的旧项目

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

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

    class Data implements IsSerializable {
           List<IsSerializable> data;
           ...
    }
  1. 我想在新项目中做同样的事情,但似乎有许多类需要修改。因此,随着项目的不断发展,问题越来越多。
  2. 我不知道该用什么代替

    List<IsSerializable> data;
    

    传输数据。

1 个答案:

答案 0 :(得分:0)

您需要阅读有关GWT序列化政策的更多信息:

Serializable Types

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

您的可序列化对象:

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

如果满足以下所有条件,则用户定义的类是可序列化的:   它可以分配给IsSerializable或Serializable,因为它直接实现了这些接口之一,或者因为它派生自一个超类   所有非最终的非瞬态实例字段本身都是可序列化的,并且   从GWT 1.5开始,它必须有一个默认(零参数)构造函数(带有任何访问修饰符)或根本没有构造函数。

所以你应该有类似的东西:

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

您的列表模板是一种类型,您没有设置'IsSerializable'......它应该是这样的:

List<int> data;