GWT和Android通信。枚举序列化问题

时间:2013-09-27 11:55:27

标签: java android gwt enums gwt-syncproxy

我有一个完美的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

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

我尝试使用IsSerializableSerializable的不同组合,并在部署之前始终清理项目。 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应用。

2 个答案:

答案 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接口。