【问题标题】:GWT serialize a class extending a TreeSetGWT 序列化扩展 TreeSet 的类
【发布时间】:2014-03-19 07:21:51
【问题描述】:

我有一个 GWT 共享包类如下:

public class MyCustomClass extends TreeSet<MyCustomType> implements Serializable, IsSerializable {
     // ... a whole bunch of methods
}

我正在尝试通过 RPC 将类的实例作为封装在另一个类中的对象发送。

问题在于TreeSet,因为无论我做什么,GWT 都拒绝序列化它。我在运行时遇到错误:

严重:我的服务:处理此调用时引发了 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 时,一切正常。据我了解,这是因为我已经在多个服务中使用了ArrayLists,所以 GWT 知道在序列化策略中将其列入白名单。

这种理解来自this 线程。我已经从接受的答案中尝试了建议的解决方案(创建一个“虚拟”服务并在那里放置一个 TreeSet,我什至在我的客户端包中创建了一个虚拟类并将 TreeSet 作为一个字段),但没有运气。

我检查了我的 .gwt.xml 以防万一,TreeSet 没有作为序列化异常添加。

所以,我几乎被困在这一点上,我的解决方法是使用 ArrayList 并将其重新打包到一个瞬态集合中,但我不太喜欢这种方法。

任何帮助将不胜感激。

(使用 GWT 2.6)

更新:MyCustomType 实现了Comparable&lt;MyCustomType&gt; 接口,并且没有为TreeSet 提供自定义比较器。

【问题讨论】:

  • MyCustomType 是否实现了java.lang.Comparable

标签: java gwt serialization arraylist treeset


【解决方案1】:

可能是MyCustomType 没有实现java.lang.Comparable

它适用于ArrayList&lt;MyCustomType&gt;,但不适用于TreeSet&lt;MyCustomType&gt;


--编辑--

HashSet&lt;MyCustomType&gt;LinkedHashSet&lt;MyCustomType&gt; 工作正常。

在客户端获取数据后,只需使用

new TreeSet<MyCustomType>(<retured HashSet<MyCustomType>)

不需要迭代,因为它是由&lt;Comparable&lt;MyCustomType&gt;排序的。

【讨论】:

  • 它确实实现了 Comparable,所以它必须是别的东西:/
  • 好的,让我弄清楚。
  • 所有模型类都在实现IsSerializableSerializable,对吧?
  • 是的,他们是。就像我说的,一旦我从 TreeSet 切换到 ArrayList(其他一切都保持不变),一切正常。
  • HashSet&lt;MyCustomType&gt;LinkedHashSet&lt;MyCustomType&gt; 工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
相关资源
最近更新 更多