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

Baz*_*Baz 6 java gwt enums android 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(){}
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误信息是:

com.google.gwt.user.client.rcp.IncompatibleRemoteServiceException: Invalid type signature for package.ReferenceTable
Run Code Online (Sandbox Code Playgroud)

这表明这是一个与序列化有关的问题.

我尝试使用和的不同组合,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
Run Code Online (Sandbox Code Playgroud)

编辑:

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

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

JCr*_*ket 2

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

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

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

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

也就是说,如果您的项目可行,请尝试使用 GWT 2.5.0,清理/重新编译并尝试一下。如果没有,我的待办事项列表就是将库升级到 2.5.1,但我还没有时间。

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