gpt4 book ai didi

java - GWT 与Android 通信。枚举序列化问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:17:02 25 4
gpt4 key购买 nike

我有一个完美运行的 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 服务器-客户端通信本身工作。


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

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 中,修改 URL 以指向 GWT 应用。

最佳答案

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

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

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

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

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

免责声明:我作为 gwt-syncproxy 项目的贡献者创建了相关的 Android 库。我不能声称了解 GWT 或 syncproxy 内部的所有来龙去脉,但至少足以让库的工作模型发挥作用。我乐于接受关于改进库的建议,或者如果有任何 gwt-guru 在那里,我们应该在内部的哪个地方寻找解决这个问题的任何想法......

关于java - GWT 与Android 通信。枚举序列化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19050147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com