【问题标题】:Second compilation of same sources produces different set of gwt.rpc files相同源的第二次编译产生不同的 gwt.rpc 文件集
【发布时间】:2011-11-26 07:15:09
【问题描述】:

我想跟进这个问题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;
    

    传输数据。

【问题讨论】:

    标签: gwt collections compilation


    【解决方案1】:

    您需要阅读更多关于 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多