6

我有一个完美运行的 GWT 应用程序。现在我正在尝试使用gwt-syncproxy创建一个可以简单地重用服务器端代码的Android客户端。

到目前为止,一切都运行良好。我能找到的唯一问题是当我启动 RPC 到一个期望枚举作为参数的方法时。

枚举看起来像这样:

import java.io.Serializable;
import com.google.gwt.user.client.rpc.IsSerializable;

public enum ReferenceTable implements IsSerializable, Serializable
{
    basetable, othertable;

    ReferenceTable(){}
}

我收到的错误消息是:

com.google.gwt.user.client.rcp.IncompatibleRemoteServiceException: Invalid type signature for package.ReferenceTable

这表明这是与序列化有关的问题。

我尝试使用不同的组合IsSerializable并且Serializable总是在部署之前清理项目。GWT 应用程序和 Android 应用程序对用于通信的数据类型使用相同的代码。

有谁知道如何解决这个问题?如果没有其他方法,我可以避免使用枚举,但我更喜欢使用它们。特别是,因为一切都适用于 GWT 服务器-客户端通信本身。


顺便说一句:服务器端的错误是:

Caused by: com.google.gwt.user.client.rpc.SerializationException: Invalid type signature for some.package.ReferenceTable
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.validateTypeVersions(ServerSerializationStreamReader.java:1116)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.deserialize(ServerSerializationStreamReader.java:610)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.readObject(ServerSerializationStreamReader.java:567)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader$ValueReader$8.readValue(ServerSerializationStreamReader.java:140)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.deserializeValue(ServerSerializationStreamReader.java:425)
    at com.google.gwt.user.server.rpc.RPC.decodeRequest(RPC.java:312)
    ... 24 more

编辑

我创建了一个示例 GWT 应用程序和一个示例 Android 应用程序,因此人们可以实际尝试以下代码:

要部署应用程序,只需修改build.properties文件,然后build.xml作为 ant 脚本运行。在MainActivityAndroid 应用程序中,修改 URL 以指向 GWT 应用程序。

4

2 回答 2

2

我无法按照描述验证您的问题(使用您提供的 src,它使用 JB 模拟器在我的开发环境中工作),尽管我在开发 Android 库期间看到了您指定的错误。我发现 GWT 中的许多“序列化”问题通常都很小,例如不可序列化的成员类型、缺少接口、默认构造函数等。由于您似乎已经解决了这些可能性,请验证以下内容:

您机器上的 Web 应用程序中使用的 GWT 版本。正在测试的 Android 操作系统版本(模拟器或设备)以及适用的设备。

虽然我不认为这是一个问题,但 Android 库是使用 GWT 2.5.0 src 编译的,因此如果服务器运行 GWT 不是 2.5.0,则 RPC 序列化可能会失败(尚未经过测试的理论)因为那个。

这也可以解释为什么桌面客户端可以工作而 android 库不能。桌面客户端 syncproxy 库是针对 GWT 而不是 GWT 编译的,因此您在编译时链接您的 GWT 版本。Android 库是使用 2.5.0 的 GWT src 代码直接编译的,并带有一些自定义覆盖,以减小库的大小,以便在 Dalvik 环境中使用和管理。

也就是说,如果它可能适用于您的项目,请尝试使用 GWT 2.5.0,清理/重新编译并试一试。如果没有,我的待办事项清单上有让库升级到 2.5.1,但我还没有时间。

免责声明:我作为 gwt-syncproxy 项目的贡献者创建了有问题的 Android 库。我不能声称了解 GWT 或 syncproxy 内部的所有细节,但至少足以让库的工作模型发挥作用。如果有任何 gwt-guru 存在,我愿意接受有关改进库的建议或任何关于我们应该在内部解决这个问题的想法......

于 2013-10-06T10:15:59.183 回答
0

从以下位置删除 IsSerializable 接口声明:

public enum ReferenceTable implements IsSerializable, Serializable

至:

public enum ReferenceTable implements Serializable

如果你的应用程序是纯粹的 GWT,你必须使用 IsSerializable 接口,但是,在这种情况下,你想在 Android 应用程序中使用相同的代码,你必须只使用 Serializable 接口。

于 2013-10-04T20:07:43.443 回答