【问题标题】:FieldSerializer compile error in GWT serializationGWT 序列化中的 FieldSerializer 编译错误
【发布时间】:2013-01-03 23:44:28
【问题描述】:

我遇到了这个错误:

[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 项目 here 中隔离了问题(只需在 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 不能在其中项目。所以我按照格伦在this other stackoverflow topic 中的回答为每个POJO 制作了一个包装类,它扩展了原始POJO 并实现了IsSerializable。

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

【问题讨论】:

    标签: java gwt serialization


    【解决方案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)
    

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

    【讨论】:

    • 感谢您的努力。有趣的是,删除包装器并简单地使用 java.io.Serializable 仍然会产生相同的错误。我现在找到了原因,它是我的 XML 结构中的 Object.java 类。删除它解决了我的问题。所以现在我把它命名为不同的,它工作正常。显然 GWT 在序列化时使用我的 Object.java 而不是 java.lang.Object,因为它在同一个包中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多