GWT 序列化问题

Posted

技术标签:

【中文标题】GWT 序列化问题【英文标题】:GWT serialization issue 【发布时间】:2010-05-19 02:00:07 【问题描述】:

我有一段时间返回一个通过 RPC 实现 IsSerializable 的对象的 ArrayList。 IsSerializable pojo 包含一个变量,一个字符串,并且有一个参数为 0 的构造函数。我已经从我的战争中删除了 .gwt.rpc 文件,但我仍然得到:

com.google.gwt.user.client.rpc.SerializationException: Type 'com.test.myApp.client.model.Test' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = com.test.myApp.client.model.Test@17a9692
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:610)

我正在使用 GWT 2.0.2 和 jdk 1.6.0_18。

对可能发生的事情或我做错了什么有任何想法?

这是 Test 类的代码,远程方法返回 ArrayList。我什至修改了它的代码,只返回一个具有相同结果的 Test 实例:上面的异常。

package com.test.myApp.client.model;

import com.google.gwt.user.client.rpc.IsSerializable;

public class Test implements IsSerializable
    private String s;

    public Test() 

    public Test(String s) 
        this.s = s;
    

    public String getS() 
        return s;
    

    public void setS(String s) 
        this.s = s;
    

非常感谢您的帮助!涡流

【问题讨论】:

可以发布client.model.Test的代码吗? 可能 Test 类中的实例字段之一是不可序列化的。发布代码以获得更多帮助。 您是否将远程服务方法声明为返回 ArrayList?如果您只是声明 ArrayList,那么 GWT 将不知道您将需要序列化 ​​Test。正如上述评论者建议的那样,发布代码。 我验证过了,Test类没有出现在.gwt.rpc文件中。 【参考方案1】:

这听起来可能很傻,但是您的代码中是否有默认的 Test 构造函数,而不仅仅是您在此处发布的代码版本?我遇到了同样的错误,用谷歌搜索,在这里尝试了一些建议,如清理/重建、添加 serialVersionUID,但都没有奏效。然后我进行了更多搜索并找到了一个建议,以确保您尝试序列化的类具有默认构造函数。我的没有,只要我添加一个,它就起作用了。我不知道为什么会修复它,但确实如此。

【讨论】:

那是因为 GWT 序列化不是 Java 序列化...在 FAQ 中解释:code.google.com/intl/fr/webtoolkit/doc/1.6/…【参考方案2】:

我还在有问题的类中添加了一个空构造函数,它运行良好。

【讨论】:

【参考方案3】:

远程方法需要返回ArrayList<Test>,而不仅仅是ArrayList,这样GWT 才能理解Test 的实例需要被序列化。

【讨论】:

远程方法正在返回 ArrayList。就像我说的,我什至尝试返回一个具有相同结果的 Test 实例。【参考方案4】:

我习惯使用 Serializable 接口声明,所以这个答案可能不适用。

Eclipse 总是提示我为任何 Serializable 类创建一个 serialVersionUID 成员。

private static final long serialVersionUID = 2388319784164372900L;

我突然想到,你的构建中有些东西不同步。我建议你做两件事: a) 项目 |清理,然后 b) GWT 编译项目。

【讨论】:

我尝试将 Serializable 与生成的 serialVersionUID 一起使用,但这也不起作用。不过谢谢!还有其他想法吗? 我昨晚刚遇到这个错误消息。我(多次)部署了一个稍作修改的相当大的项目,但没有增加版本号,并不断在旧类上获取序列化异常。最后增加版本号并重新部署 - 它清除了。你的 Test 类甚至被翻译成 javascript 了吗?检查 myApp.gwt.xml 标记中包含的路径。评论指出“指定可翻译代码的路径”。【参考方案5】:

我对 ArrayList 也有同样的问题。我刚刚添加了一个空的构造函数,它工作。 (我的班级已经实现了 Serializable)

【讨论】:

【参考方案6】:

或其Class对象无法加载

com/test/myApp/client/model/Test.class 是否包含在您的战争中?

【讨论】:

【参考方案7】:

这些情况会导致 GWT 序列化抛出错误:

1) 你的类没有实现 Serializable 或 IsSerializable。 2) 没有默认构造函数 3) GWT 无法将您的类添加到“白名单”,因为对代码的静态分析未显示您的类将包含在 RPC 中。对于这种情况,我创建了一个“WhiteList”操作/结果 RPC 对(遵循命令模型)并确保操作对象具有失败的相关类的成员。有时您可能会发现对象作为非生成集合中的 RPC 调用的一部分返回,而 GWT 不知道包含它。在这种情况下,将其添加到“WhiteList”操作类也会有所帮助。

【讨论】:

【参考方案8】:

我注意到您的类在“com.test.myApp.client.mode”包中,这表明它是一个“测试”类(而不是您预期的部署的一部分) .

你的 gwt 模块文件 (myApp.get.xml) 真的在 com.test.myApp 中吗?

如果是这样,您选择的包名称很糟糕。避免在你的主包名中加入“test”——惯例规定这意味着它是一个测试包。

如果没有,请尝试将您的课程移动到“主”包,例如“com.mycompany.myApp.client.mode”(假设您的获取模块文件在 com.mycompany.myApp 中) .

【讨论】:

以上是关于GWT 序列化问题的主要内容,如果未能解决你的问题,请参考以下文章

GWT:序列化异常

如何使用 GWT 序列化流工厂

GWT 序列化异常

GWT 和 Android 通信。枚举序列化问题

执行 RPC 时出现 GWT 序列化问题

使用 GWT 内置的 RPC 序列化/反序列化机制