【问题标题】:Class won't serialize using GWT-RPC?类不会使用 GWT-RPC 序列化?
【发布时间】:2012-08-22 22:25:53
【问题描述】:

这是我要发送的课程:

public class DummyClass implements Serializable, IsSerializable {

  private Map<String, Object> properties = new HashMap<String, Object>();


  public DummyClass() {
    // stuff
  }
  public Object getValue(String key) {
    return properties.getValue(key);
  }
  public void setValue(String key, Object value) {
    properties.put(key, value);
  }
}

但是当我尝试将它作为参数发送到 GWT RPC 中的方法时,我得到了一个伞形异常。

  DummyClass dummy = new DummyClass();
  dummy.setValue("foo", "bar");
  ServiceImpl impl = Gwt.create(SampleService.class).doSomething(dummy);

我可以删除 Map properties... 中指定的泛型类型,但除了 Object 或 Serializable 之外,对属性映射中可以存储的内容没有任何限制。

使用 Java 的标准序列化可以很好地序列化类的实例。

此外,GWT 编译器没有显示警告或错误。

有什么人可以指出我可以尝试让它工作吗?

【问题讨论】:

  • Java 序列化的基础知识:让Java 序列化Object 类型就像给银行出纳员一张空白支票并告诉出纳员您希望将支票存入银行。永远不要在 RPC 数据传输对象中封装/嵌入不确定的对象。
  • 那么我怎样才能将字符串键映射发送到各种值(日期、字符串、整数等类型)?这使用 Java 序列化就可以很好地序列化...

标签: java gwt serialization gwt-rpc


【解决方案1】:

也许你可以尝试用更具体的东西(例如java.io.Serializable)替换getValue() 的java.lang.Object 返回类型和setValue() 方法的参数类型。

请注意,如果您的对象仅实现 Serializable(除此之外无需实现 IsSerializable),您也可以。

【讨论】:

  • Serializable 非常通用,会导致编译器找到实现 Serializable 且位于源路径上的 所有 类。这反过来将导致为所有这些及其所有子类生成字段序列化程序。在导致这种特定品牌的膨胀之前,请确保这确实是您想要的。
  • 对 - 确实,应该提供更具体的类型。
  • 能否提供异常的堆栈跟踪?
  • 不幸的是,没有...我放弃了所有内容,只是制作了一个 DTO 来单独包含所有字段...问题肯定是“对象”或“可序列化”类型声明... GWT 编译器将遍历并编译类路径上的每个 object 或 serializable。
  • 您可以使用的另一个选项是在已经可序列化的类型中使用虚拟异步方法或字段来引用允许的类型。这足以向编译器提示这些其他类型可以通过网络发送。
猜你喜欢
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 2012-04-18
  • 2012-03-21
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多