【问题标题】:SerializationPolicy error when performing RPC from within GWT application从 GWT 应用程序中执行 RPC 时出现 SerializationPolicy 错误
【发布时间】:2011-05-11 07:38:44
【问题描述】:

我收到以下异常:

com.google.gwt.user.client.rpc.SerializationException:类型“java.lang.Long”未包含在可由此 SerializationPolicy 序列化的类型集中,或者无法加载其 Class 对象。出于安全考虑,该类型不会被序列化

使用 GWT 2.1 和内置的 Jetty 服务器。根据文档,这种类型绝对是可序列化的......我怎样才能将它包含在 SerializationPolicy 中?

【问题讨论】:

  • 您能告诉我们导致异常的远程接口吗?
  • 是的,我什么都试过了。明确引用所需类型的清理、重建、虚拟方法,并且仍在发生。事实上,它发生在许多不同的类型上。日期、整数等。最初的问题是在仅使用泛型(Map)之后出现的。

标签: java serialization gwt rpc gwt-rpc


【解决方案1】:

这是应该解决问题的链接: http://developerlife.com/tutorials/?p=131

如果满足以下条件,用户定义的类是可序列化的:

  1. 该类可分配给 IsSerializable 或 java.io.Serializable,因为它实现了这些接口之一,或者因为它派生自实现这些接口之一的超类。
  2. 类的所有非最终、非瞬态实例字段都是可序列化的
  3. 该类有一个公共默认(零参数)构造函数

【讨论】:

  • 对,这就是他们的要求
  • 非常感谢,没有这个我无法解决我的问题。
  • 完成所有这些操作后,我没有重新加载浏览器窗口并不断收到错误消息。这对我有帮助 comments.gmane.org/gmane.org.google.gwt/76401
【解决方案2】:

需要在 RPC 服务中包含一个多余的方法,将多个对象“列入白名单”。这是因为使用了泛型,GWT 无法确定我可能要序列化哪个对象以包含在某个泛型中。

我包含了所有可能需要(取消)序列化为对象成员的类型 (SerializableWhitelist)。我向 RPC servlet 对象添加了一个方法,例如:

public SerializableWhitelist junk(SerializableWhitelist l) { return null; }

值得注意的是,您需要将白名单数据类型作为参数和返回类型包括在内,因为 GWT 显然维护了两个单独的序列化策略。

【讨论】:

  • 非常感谢。一个星期以来,我一直在寻找解决该设计问题的方法。尽管这是一种解决方法 - 明确定义白名单似乎是一个好主意。
  • 非常感谢;没有你的回答,我会尝试修复这些东西几个小时:)
【解决方案3】:

尝试删除您的 war/app 目录中的 *.gwt.rpc 文件,清理并重建。

需要注意的一点:如果可能,您应该避免 long 或 Long,因为它们是
在 GWT 上模拟(因为没有原生 Javascript 长)并且非常
慢。尽可能使用 int。

【讨论】:

  • 从我的 war/myapp 目录中删除 *.gwt.rpc 文件为我解决了这个问题。 (事实上​​,我只是对我的 war/myapp 目录中的所有内容进行了核对。)我不需要任何虚拟调用,因为我的类已经在其他 RPC 调用中传入/传出。我有一个默认构造函数。另一件需要注意的事情:确保在 URL 中使用“?gwt.codesvr=127.0.0.1:9997”...
【解决方案4】:

仅供参考,我已将此作为 GWT 错误提出:http://code.google.com/p/google-web-toolkit/issues/detail?id=5811

我们会看看他们怎么说。

【讨论】:

  • 大卫,你通常如何解决这个问题?
  • 如错误/上述评论中所述 - 要么摆脱泛型(例如,通过使用数组而不是集合),要么通过包含直接引用导致问题的类型的虚假 RPC 方法.令人失望的是,谷歌在六个月内没有表明该错误有任何进展,尽管我没有机会在比我的旧 1.7 更新的 GWT 版本中尝试这个。
【解决方案5】:

FWIW,我遇到了这个问题,但我的“对象”类型隐藏在泛型类后面。错误消息本身是错误的。

因此,如果您的 rpc 方法之一涉及一个类:

class Xxx<T> implements IsSerializable {...

需要改成:

class Xxx<T extends IsSerializable> implements IsSerializable {...

【讨论】:

    【解决方案6】:

    问题还可能是因为您运行托管模式的本地计算机上的代码与您通过 RPC 连接的外部服务器上的代码不同。因此,就我而言,我在本地机器上缺少 git pull 以匹配外部服务器上部署的内容。更改很少,只是 gwt.rpc 中包含的一个类中的一个新属性,但这已经足够 gwt.rpc md5 文件名不同,因此发生了上述错误。

    【讨论】:

      【解决方案7】:

      灵感来自http://groups.google.com/group/google-web-toolkit/browse_thread/thread/7dd5123d359ddfa8

      使用 eclipse 和 maven 以及 gwt 2.1.1

      编译和部署 gwt war。

      尝试使用从 Eclipse 启动的 OOPHM。

      这对我来说会失败。

      这将在服务器日志中生成:

      错误:未找到序列化策略文件“blah.gwt.rpc”;您是否忘记将其包含在此部署中?

      警告:无法获取模块“http://blah:8080/BlahUI/BlahUI/”的序列化策略“94DEC228B2828D3A5897FEE3D6845A40”;将使用与 1.3.3 兼容的旧版序列化策略。因此,您可能会遇到 SerializationExceptions。

      然后

      分派传入 RPC 调用时出现异常 com.google.gwt.user.client.rpc.SerializationException:类型“[LpathToClass;”不能分配给 'com.google.gwt.user.client.rpc.IsSerializable' 并且没有自定义字段序列化程序。出于安全目的,不会序列化此类型。: instance = [LpathToClass;@9d524af 在 com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:614)

      现在已经生成了额外的 gwt.rpc 文件(通过 eclipse/maven 插件谁知道?)

      重新编译(即使是干净的编译也可以,因为 gwt.rpc 文件不在目标文件夹中,我的 OOPHM gwt.rpc 文件与入口点 html 位于同一文件夹中)并重新部署。这个新的 war 文件将包含生成的 gwt.rpc 文件。

      从 Eclipse 重新启动 OOPHM。

      为我工作。

      【讨论】:

        【解决方案8】:

        另一个 FWIW:我相信我通过更改解决了枚举类中的类似问题 默认的单参数构造函数的访问修饰符(无修饰符) 为“私人”。无论如何,这样做并没有破坏它,因为它现在是这样工作的。

        【讨论】:

          【解决方案9】:

          我遇到了这个错误并完全卡住了 1 天。然后我遇到了以下快速解决方案:

          确保您的 DTO 或实体类遵循可序列化的接口规则。 这是您唯一需要做的事情,因为其余的问题将与您的构建创建有关。 因此,如果您使用的是 maven,请确保进行干净的构建并清除所有浏览器缓存。 我解决了我的问题。我希望它会有所帮助。谢谢!

          【讨论】:

            【解决方案10】:

            确保课程在共享文件夹中。 这就是我所缺少的。

            【讨论】:

              猜你喜欢
              • 2012-03-25
              • 1970-01-01
              • 2020-03-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-05-08
              • 1970-01-01
              • 2023-01-12
              相关资源
              最近更新 更多