我有一个GWT共享包类,如下所示:
public class MyCustomClass extends TreeSet<MyCustomType> implements Serializable, IsSerializable {
// ... a whole bunch of methods
}
我试图通过RPC发送一个类的实例作为封装在另一个类中的对象。
问题是TreeSet
,因为GWT拒绝将其序列化,无论我做什么。我在运行时遇到错误:
SEVERE:my-service:处理此调用时抛出了IncompatibleRemoteServiceException。 com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException:java.lang.ClassNotFoundException:http: 在com.google.gwt.user.server.rpc.RPC.decodeRequest(RPC.java:323)
所以,我有所有的序列化先决条件(默认构造函数,没有最终字段,getter和setter,我的所有实例变量都是可序列化的,实现接口等),但这种情况仍在继续发生。
问题是,当我从TreeSet
切换到使用ArrayList
时,一切正常。根据我的理解,这是因为我已经在许多服务中使用ArrayList
,因此GWT知道在序列化策略中将其列入白名单。
由于this线程而产生了这种理解。我已经从接受的答案中尝试了提议的解决方案(创建一个&#34;虚拟&#34;服务并在其中放置TreeSet
,我甚至在我的客户端包中创建了一个虚拟类并放置了{ {1}}作为一个领域),但没有运气。
我检查了我的.gwt.xml以防万一,TreeSet
没有被添加为序列化异常。
所以,我几乎停留在这一点上,我的解决方法是使用ArrayList并将其重新打包成瞬态集,但我真的不喜欢这种方法。
任何帮助都将受到高度赞赏。
(使用GWT 2.6)
更新: TreeSet
实现了MyCustomType
界面,并且没有为Comparable<MyCustomType>
提供自定义比较器。
答案 0 :(得分:0)
可能MyCustomType
未实施java.lang.Comparable
适用于ArrayList<MyCustomType>
,但不适用于TreeSet<MyCustomType>
- 编辑 -
HashSet<MyCustomType>
或LinkedHashSet<MyCustomType>
工作正常。
在客户端获取数据后,只需使用
new TreeSet<MyCustomType>(<retured HashSet<MyCustomType>)
无需迭代它,因为它是按<Comparable<MyCustomType>
排序的。