【问题标题】:Problem serialising generated class问题序列化生成的类
【发布时间】:2011-11-21 02:03:29
【问题描述】:

我正在为我的应用程序使用 GWT 2.3。我创建了一个生成器来生成类并向它们添加行为。

我的生成器工作正常,我可以在客户端调用 GWT.create(MyClass.class)。这确实会返回具有正确字段/方法的 MyClassImpl 对象。当我尝试序列化对象以将其发送回服务器时,我遇到了 SerializationException。

调试后,RPC 生成器似乎找不到 MyClassImpl 的类定义。

有没有办法解决这个问题?我假设我自己的生成器生成的类定义将可用于 RPC 生成器,除非这个类定义在我的生成器之前运行?

提前感谢您的帮助。

法里德



您好,感谢您的快速回答,

我生成的类如下: - 它有一个公共的无参数构造函数 - 它实现了 Serializable (并且确保我尝试了 Serializable 和 IsSerializable 的所有组合) - 在共享包中生成(当我调用 GWT.create() 时由我的生成器生成) - 它的所有属性都是“简单的”(原始或字符串)

看起来像这样(TestClass 是生成器的标记接口):

package com.test.shared;

import com.test.shared.TestClass;

public class TestClass_Impl implements TestClass, Serializable {
  private String testString = "TestString";

  public TestClass_Impl() {}

  public String getTestString() {
    return testString;
  }
}

我可以在客户端调用 GWT.create(TestClass.class)。我得到了一个 TestClass_Impl 的实例,但是当我尝试通过 GWT RPC 调用通过网络将它发送到服务器时,我得到了一个异常:

com.test.server.TestServiceServlet-29927840: An IncompatibleRemoteServiceException was thrown while processing this call.
com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException: java.lang.ClassNotFoundException: com.test.shared.TestClass_Impl
    at com.google.gwt.user.server.rpc.RPC.decodeRequest(RPC.java:315)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:206)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
....
Caused by: com.google.gwt.user.client.rpc.SerializationException: java.lang.ClassNotFoundException: com.test.shared.TestClass_Impl
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.deserialize(ServerSerializationStreamReader.java:573)
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamReader.readObject(AbstractSerializationStreamReader.java:119)
...
Caused by: java.lang.ClassNotFoundException: com.test.shared.TestClass_Impl
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:366)
    at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:337)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.deserialize(ServerSerializationStreamReader.java:543)

看起来 GWT RPC 在尝试实例化类 TestClass_Impl 时无法在服务器上找到它。

有什么想法吗? 谢谢,

远方



谢谢你。这正是发生的事情。 GWT 似乎生成 java 源代码只是为了将其交叉编译成 javascript,然后丢弃生成的 java 文件。有一个编译器选项可将生成的 java 代码保存在特定文件夹中,但生成的 .java 文件不会与构建一起编译。

虽然非常复杂和笨拙,但可以更改构建过程以获取由我的生成器生成的源文件并将它们包含在构建路径中,以便可以在运行时对其进行编译和使用。

我创建了一个单独的类来生成我的 java 源代码。生成器使用这个类来生成要被 GWT 交叉编译的 java 源代码。然后,我的应用程序使用同一个类来动态生成这些 java 类并将其加载到 VM 中。然后它们在运行时可用,并且一切似乎都工作正常。

再次感谢您的帮助,如果有人需要有关此解决方法的更多信息,我很乐意将其发送给他们。

【问题讨论】:

    标签: gwt generator rpc


    【解决方案1】:

    我认为问题在于,生成的类应该同时存在于客户端和服务器上。这就是您收到此错误的原因。据我所知,生成器不能在服务器端工作。可能有办法让它们工作,但我不知道。可能的解决方案 - 使用 -gen 选项启动编译器以将生成的类保存到磁盘,将它们编译为 *.class 并复制到服务器类路径。或者不要使用 GWT-RPC =)

    【讨论】:

    • 谢谢你。这正是原因。我已经用一种解决方法更新了我的问题,让我可以在客户端和服务器上使用相同的类。
    • @Farid.O:您可以考虑通过单击左侧的复选标记来接受此答案。哦,欢迎来到 StackOverflow。
    【解决方案2】:

    确保您的生成器生成生成的类IsSerializable(即实现 IsSerializable 接口)。

    【讨论】:

    • 虽然它在某处读到可以使用 Serializable 和 IsSerializable,但前一段时间我遇到了一个问题,当我使用 GWT 的 IsSerializable 时它就消失了。不确定在这种情况下这是否重要。
    • 您还需要确保,您有一个公共的零参数构造函数或根本没有构造函数。见Serializable User-defined Classes
    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多