0

当我尝试编译我的 GWT 应用程序时,我遇到了很多错误。他们之中有一些是

[ERROR] com.google.gwt.xml.client.impl.AttrImpl is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer. 
              [ERROR] com.google.gwt.xml.client.impl.CDATASectionImpl is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer. 
              [ERROR] com.google.gwt.xml.client.impl.CommentImpl is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer.
              [ERROR] com.google.gwt.xml.client.impl.DocumentFragmentImpl is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer.
              [ERROR] com.google.gwt.xml.client.impl.DocumentImpl is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer. 
              [ERROR] com.google.gwt.xml.client.impl.ElementImpl is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer.
              [ERROR] com.google.gwt.xml.client.impl.EntityReferenceImpl is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer. 
              [ERROR] com.google.gwt.xml.client.impl.NamedNodeMapImpl is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer.
              [ERROR] com.google.gwt.xml.client.impl.NodeImpl is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer. 
              [ERROR] com.google.gwt.xml.client.impl.NodeListImpl is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer. 
              [ERROR] com.google.gwt.xml.client.impl.ProcessingInstructionImpl is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer. 
              [ERROR] com.google.gwt.xml.client.impl.TextImpl is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer. 
              [ERROR] java.util.AbstractList.SubList<E> is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer. 
              [ERROR] java.util.AbstractList.SubList<E> is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer.
              [ERROR] java.util.Collections.UnmodifiableList<T> is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer.
              [ERROR] java.util.Collections.UnmodifiableList<T> is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer. 
              [ERROR] java.util.Collections.UnmodifiableRandomAccessList<T> is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer. 
              [ERROR] java.util.Collections.UnmodifiableRandomAccessList<T> is not default instantiable (it must have a zero-argument constructor or no constructors at all) and has no custom serializer.
              [ERROR] java.util.LinkedList.Node<E> is not assignable to 'com.google.gwt.user.client.rpc.IsSerializable' or 'java.io.Serializable' nor does it have a custom field serializer 
              [ERROR] java.util.LinkedList.Node<E> has no available instantiable subtypes. 
              [ERROR]    subtype java.util.LinkedList.Node<E> is not assignable to 'com.google.gwt.user.client.rpc.IsSerializable' or 'java.io.Serializable' nor does it have a custom field serializer 

我在客户端代码中收到此错误!从我可以从互联网上读到的任何内容,它说我根本无法将在 JRE 容器中运行的所有标准方法模拟为 GWT,因为它将在运行时编译为 Javascript。但我太缺乏经验,无法理解这个错误。对此有任何帮助将不胜感激!

4

2 回答 2

1

三个格言:

  • GWT Java 是 Java 但不是 Java
  • GWT Java 实际上是 Java 编译器友好的 Javascript。
  • 实现 Serializable 可能不是 GWT Serializable

只要实现Serializable,任何东西都可以序列化吗?

在 Java SE/EE 字节码世界中,序列化更简单。在以下类声明中:

class Spider
implements Serializable{
  String a;
  Integer b;
  Cobweb c;
}

编译器会通过 a 和 b,因为 String 已经有自己的序列化编解码器(即 coder/decoder 或 marshaller/demarshaller)。整数也是如此。

然后编译器尝试查看 Cobweb 是否通过提供自己的编解码器来实现 Serializable 或者 Cobweb 是否包含 Serializable 成员,例如

class Cobweb 
implements Serializable{
  Boolean d;
  Double e;
}

d 和 e 都已经有了由 Sun/Oracle 对 Java 语言的管理所提供的序列化编解码器。

如果 CobWeb 允许泛型参数怎么办?

class Cobweb <T>
implements Serializable{
  Boolean d;
  T e;
}

Cobweb<Float>将是可序列化的,因为 Java 已经有 Float 的序列化编解码器。

但是,除非 Donkey 有自定义序列化编解码器,否则编译器会在以下内容上发牢骚

class Spider
implements Serializable{
  String a;
  Integer b;
  Cobweb<Donkey> c;
}

GWT 可串行化是什么意思?

实现 Serializable 还不够吗?为什么,谷歌正在实现一个新的 Serializable 接口?没有。这是谷歌的错,但不是谷歌的错。

GWT UI Java 在运行之前总是被编译成 Javascript。GWT UI Java 的本机代码是 Javascript,而不是二进制 Java 字节码。由于浏览器只运行 Javascript 而不是 Java 字节码的显而易见的原因。

二进制数据和 GWT

在大多数情况下,实现 Serializable 将使您的类 GWT 可序列化。GWT 可序列化意味着存在 GWT 生成的 Javascript 代码,以便在需要时执行编解码器。即,编解码器是Java 源代码而不是Java 字节码。编解码器必须可翻译为 Javascript,因为 GWT 序列化/反序列化在浏览器上运行。

但是,有许多类 GWT 还没有编解码器。例如,GregorianCalender 和大多数需要反射的类。GregorianCalender 实现了 Serializable 但 GWT 编译器在 Java 源代码中没有任何编解码器可以翻译成 Javascript。

GWT 生成的 Javascript 无法进行运行时反射。因此,GWT 通过对您可以使用的所有可能代码的预编译排列执行延迟绑定来弥补这一缺陷。我相信 GregorianCalendar 会执行一些反射测量,并且为 GregorianCalendar 编写 GWT 编解码器将是 Javascript 代码的大量排列。我相信这是许多类没有编解码器的原因,也是原因所在。有人请纠正我。

回到原来的问题......

java.util.LinkedList.Node<E>

那么,看在上帝的份上,E到底是什么?您是否将 E 替换为 GWT 可序列化?

来自堆栈跟踪的证据(如果我什至擅长跟踪堆栈跟踪)表明您甚至没有费心用实际类型替换泛型参数。通过这样做,您将强制 GWT 编译器将 E 视为类 Object。没有人知道如何序列化类 Object。你会像创世记 41 章中的法老告诉约瑟夫,

“约瑟夫请解说我的梦,但我忘记了我的梦,所以你也必须告诉我我的梦。”

于 2012-07-18T05:00:03.517 回答
0

正如堆栈的第一行所说,要进行序列化,类需要具有不带参数的构造函数或具有自定义序列化程序。 java-custom-serialization这里是关于编写序列化程序的主题

于 2012-07-17T06:00:35.990 回答