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

Java GWT和Android通信。枚举序列化问题,java,android,gwt,enums,gwt-syncproxy,Java,Android,Gwt,Enums,Gwt Syncproxy,我有一个完美工作的GWT应用程序。现在我正在尝试使用创建一个Android客户端,它可以简单地重用服务器端代码 到目前为止,一切都很顺利。我能找到的唯一问题是当我启动RPC到一个需要枚举作为参数的方法时 枚举看起来像这样: import java.io.Serializable; import com.google.gwt.user.client.rpc.IsSerializable; public enum ReferenceTable implements IsSerializable,

我有一个完美工作的GWT应用程序。现在我正在尝试使用创建一个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
。在Android应用程序的
MainActivity
中,修改URL以指向GWT应用程序。

从以下位置删除IsSerializable接口声明:

public enum ReferenceTable implements IsSerializable, Serializable
致:


如果你的应用程序纯粹是GWT,你必须使用IsSerializable接口,但是,在这种情况下,你想在Android应用程序中使用相同的代码,你必须只使用Serializable接口。

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

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

虽然我不认为这是一个问题,但Android库是用GWT2.5.0 src编译的,因此,如果服务器运行的是GWT2.5.0以外的版本,则RPC序列化可能因此而失败(这是一个尚未测试的理论)

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

也就是说,如果您的项目可能,请尝试使用GWT 2.5.0,清理/重新编译并试一试。如果没有,我的任务清单上会列出如何将库升级到2.5.1,但我还没有时间。


免责声明:我创建了有问题的Android库,作为gwt syncproxy项目的贡献者。我不能说我了解GWT或syncproxy内部的所有细节,但至少足以让库的工作模型正常工作。我愿意听取关于改进库的建议,或者任何关于如果有gwt大师的话,我们应该在内部解决这个问题的想法…

您是否尝试向可引用类添加无参数构造函数?@ElHoss请再次查看代码。有一个非参数构造函数。ups。。。你是对的。您的类是否在源程序包中?@ElHoss是的,它位于标记为源程序的
共享
程序包中。只是发现了一些问题:Enum本身已可序列化,无法工作。添加可序列化的接口有什么帮助?您是否已经删除了可序列化的接口并进行了测试?这里的问题是,IsSerializable接口是GWT独有的,当您尝试与其他平台(本例中为Android)交互时,您必须声明IsSerializable接口,或删除GWT代码中的引用。是的,我已经尝试了所有组合。仅供参考,该应用程序(GWT和Android)可用于
IsSerializable
,但不可用于枚举。检查此项,可能会有用:不幸的是,我以前都读过,但没有一个包含我问题的解决方案。我再怎么强调这一点都不为过,因为实际的GWT应用程序正在运行,所以没有问题。这是GWT和GWT-syncproxy.Brilliant组合的一个具体问题,将示例应用程序切换到GWT 2.5.0就成功了。你能告诉我你什么时候能把库更新到2.5.1吗?如果你没有时间,我可以将主应用程序切换到2.5.0。但是,如果可能的话,我更愿意使用最新版本。请让我知道您是否计划更新到2.5.1!:)本周我将查看2.5.1源代码,看看是否可以实现。如果是这样,我将尝试在一两周内推出一个兼容2.5.1的库。如果文件发生了重大更改,我可能需要更长的时间来筛选出与2.5.1兼容的内容(根据我的日程安排,最多需要一个月)。如果看起来需要那么长时间,我可能会推迟到2.6版本(预计12月初)。密切关注wiki和项目的问题跟踪器(我不能修改项目主页,因为我不是项目所有者,所有者是…MIA)。这很好。我真的很期待!
public enum ReferenceTable implements Serializable