我有一个完美的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服务器 - 客户端通信本身。
BTW:服务器端的错误是:
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脚本运行。在Android应用的MainActivity
中,修改网址以指向GWT应用。
答案 0 :(得分:2)
我无法验证您所描述的问题(使用您提供的src,它可以在我的开发环境中使用JB模拟器工作),尽管我在开发Android库时看到了您指定的错误。我发现GWT中的许多“序列化”问题通常很小,例如不可序列化的成员类型,缺少接口,默认构造函数等。由于您似乎已经解决了这些可能性,请验证以下内容:
您计算机上的网络应用程序中使用的GWT版本。正在测试的Android OS版本(模拟器或设备)以及适当的设备。
虽然我不希望它成为一个问题,Android库是用GWT 2.5.0 src编译的,所以如果服务器运行的是GWT而不是2.5.0,那么它可能(一个尚未经过测试的理论)由于这个原因,序列化失败了。
这也可以解释为什么桌面客户端工作而android库没有。桌面客户端syncproxy库是针对GWT而不是GWT编译的,因此您可以在编译时链接您的GWT版本。 Android库直接用2.5.0的GWT src代码编译,并带有一些自定义覆盖,以减少在Dalvik环境中可以使用和管理的库的大小。
那就是说,如果你的项目可能,尝试使用GWT 2.5.0,清理/重新编译并给它一个镜头。如果没有,我的待办事项清单就是将图书馆升级到2.5.1,但我还没来得及。
免责声明:我创建了有问题的Android库,作为gwt-syncproxy项目的贡献者。我不能声称理解GWT或syncproxy内部的所有细节,但至少足以使库的工作模型起作用。我愿意接受有关改进图书馆的建议,或者如果有任何gwt-guru的话,我们应该在内部的哪些方面解决这个问题...
答案 1 :(得分:0)
从以下位置删除IsSerializable接口声明:
public enum ReferenceTable implements IsSerializable, Serializable
要:
public enum ReferenceTable implements Serializable
如果你的应用程序纯粹是GWT,你必须使用IsSerializable接口,但是,在这种情况下,你想要使用与Android应用程序相同的代码,你必须只使用Serializable接口。