我有一个完美运行的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
文件,然后作为 ant 脚本运行build.xml
。在安卓应用的MainActivity
中,修改网址以指向 GWT 应用。
我无法按照描述验证您的问题(使用您提供的 src,它使用 JB 模拟器在我的开发环境中工作(,尽管我在开发 Android 库期间看到了您指定的错误。我发现 GWT 中的许多"序列化"问题通常是小问题,例如不可序列化的成员类型、缺少接口、默认构造函数等。由于您似乎已经解决了这些可能性,请验证以下内容:
计算机上的 Web 应用程序中使用的 GWT 版本。正在测试的 Android 操作系统版本(模拟器或设备(以及合适的设备。
虽然我不认为这是一个问题,但 Android 库是使用 GWT 2.5.0 src 编译的,因此有可能(尚未测试的理论(如果服务器运行的 GWT 不是 2.5.0,RPC 序列化因此而失败。
这也可以解释为什么桌面客户端可以工作而 android 库不能。桌面客户端同步代理库是针对 GWT 而不是使用 GWT 编译的,因此您可以在编译时链接您的 GWT 版本。Android 库是直接使用 GWT src 代码编译的 2.5.0,并带有一些自定义覆盖,以减小库的大小,使其在 Dalvik 环境中可用和管理。
也就是说,如果您的项目可能,请尝试使用 GWT 2.5.0,清理/重新编译并试一试。如果没有,在我的待办事项列表中,可以将库升级到 2.5.1,但我还没有时间。
免责声明:我创建了有问题的Android库作为gwt-syncproxy项目的贡献者。我不能声称了解 GWT 或 syncproxy 内部的所有细节,但至少足以使库的工作模型正常工作。我愿意接受有关改进库的建议,或者如果有任何 gwt 大师在那里,我们应该在内部何处寻求解决这个问题的任何想法......
从以下位置删除 IsSerializable 接口声明:
public enum ReferenceTable implements IsSerializable, Serializable
自:
public enum ReferenceTable implements Serializable
如果你的应用程序是纯粹的GWT,你必须使用IsSerializable接口,但是,在这种情况下,你想在Android应用程序中使用相同的代码,你必须只使用Serializable接口。