1

我被这个错误困住了:

[DEBUG] [testgwt] - Rebinding org.stofkat.testgwt.client.GetTestsService
[INFO] [testgwt] - Module testgwt has been loaded
[ERROR] [testgwt] - Errors in 'generated://CB9089E742875E64C1F5E08E3E60A8B5        /org/stofkat/testgwt/shared/TestsWrapper_FieldSerializer.java'
[ERROR] [testgwt] - Line 9: The type TestsWrapper_FieldSerializer must implement the inherited abstract method TypeHandler.serial(SerializationStreamWriter, Object)
[ERROR] [testgwt] - Line 9: The type TestsWrapper_FieldSerializer must implement the inherited abstract method TypeHandler.deserial(SerializationStreamReader, Object)
[ERROR] [testgwt] - Line 36: Type mismatch: cannot convert from TestsWrapper to Object
[ERROR] [testgwt] - Line 40: Cannot cast from Object to TestsWrapper
[ERROR] [testgwt] - Line 44: Cannot cast from Object to TestsWrapper
[INFO] [testgwt] - See snapshot: C:\Users\Leejjon\AppData\Local\Temp\org.stofkat.testgwt.shared.TestsWrapper_FieldSerializer4210265464022362123.java

我已经设法在这里隔离了两个 Java 项目中的问题(只需在 Eclipse 上将项目作为 GWT Web 应用程序运行,然后按下页面上的按钮)。

我正在尝试使用 libgdx 创建一个游戏,其中可以将关卡从 XML 文件加载到 POJO 中。然后我将 POJO 传递给引擎,它会显示关卡。我正在使用 SimpleXML 进行 XML 解析,因为该库适用于 Android 和桌面 Java。但是我不能在游戏的 GWT (HTML5) 版本中使用它,因为 SimpleXML 框架使用来自 java.io 的类。(这是不允许的,因为 GWT 客户端的 Java 代码被编译成 javascript,并且不允许简单地从文件系统上的任何文件中读取内容)。因此,我现在将 XML 文件加载到 GWT 服务器上的 POJO 中,并尝试使用 RPC 将其传递给客户端。

POJO 类将位于桌面 (LWJGL)、Android 和 HTML5 (GWT) 版本正在使用的 Java 项目中,因此 POJO 类无法实现 IsSerializable,因为 GWT jar 不能在该项目中。因此,我在另一个 stackoverflow 主题中遵循了 Glenn 的回答,并为每个 POJO 创建了一个包装器类,该包装器类扩展了原始 POJO 并实现了 IsSerializable。

请帮助我验证这是 GWT 中的错误还是我做错了。

4

1 回答 1

1

IsSerializable 不再是强制性的。您使用的 stackoverflow 参考确实很旧。请通过https://developers.google.com/web-toolkit/doc/latest/tutorial/RPC

为你准备的相关部分3. 序列化 Java 对象

A type is serializable and can be used in a service interface if one of the following is true:

All primitive types (int, char, boolean, etc.) and their wrapper objects are serializable by default.
An array of serializable types is serializable by extension.
A class is serializable if it meets these three requirements:
It implements either Java Serializable or GWT IsSerializable interface, either directly, or because it derives from a superclass that does.
Its non-final, non-transient instance fields are themselves serializable, and
It has a default (zero argument) constructor with any access modifier (e.g. private Foo(){} will work)

您的解决方案可能偏离了轨道。这种方法会消耗带宽和运行时性能。

于 2013-01-21T03:38:53.327 回答