GWT 对象序列化

Posted

技术标签:

【中文标题】GWT 对象序列化【英文标题】:GWT object serialization 【发布时间】:2013-04-18 23:04:36 【问题描述】:

我正在尝试从我的 mysql 数据库返回一个 arrayList 以在 GWT cellList 中使用,但我遇到了序列化问题。

类型 'com.cbs.ioma.client.Order' 未包含在集合中 可由此 SerializationPolicy 或其类序列化的类型 无法加载对象。出于安全目的,此类型不会 被序列化。:instance = Order [orderNumber=1001, orderer=test, 汇编程序=1,日期完成=1969-12-31,提交日期=1969-12-31, notes=rer, isComplete=false, type=erer]

我有一个班级订单,但是当我尝试将其更改为

public class Order implements java.io.Serializable

程序崩溃并且没有显示错误消息。我对 GWT 内部的序列化知之甚少,那么我将如何序列化一个类以在 GWT 中使用?我相信我在 service 和 serviceAync 类中有正确的函数名称。谢谢。

编辑:我将在这里添加更多内容。我尝试更改订单类以实现 isSerializable,然后出现此错误

12:55:49.793 [错误] [ioma] 未捕获的异常已转义

java.lang.ClassCastException: com.cbs.ioma.client.Order 无法转换 到 java.lang.String 在 com.google.gwt.text.shared.SimpleSafehtmlRenderer.render(SimpleSafeHtmlRenderer.java:1) 在 com.google.gwt.cell.client.AbstractSafeHtmlCell.render(AbstractSafeHtmlCell.java:80) 在 com.google.gwt.user.cellview.client.CellList.renderRowValues(CellList.java:527) 在 com.google.gwt.user.cellview.client.AbstractHasData$View.renderRowValues(AbstractHasData.java:337) 在 com.google.gwt.user.cellview.client.AbstractHasData$View.replaceAllChildren(AbstractHasData.java:239) 在 com.google.gwt.user.cellview.client.HasDataPresenter.resolvePendingState(HasDataPresenter.java:1351) 在 com.google.gwt.user.cellview.client.HasDataPresenter.access$3(HasDataPresenter.java:1062) 在 com.google.gwt.user.cellview.client.HasDataPresenter$2.execute(HasDataPresenter.java:984) 在 com.google.gwt.core.client.impl.SchedulerImpl$Task$.executeScheduled$(SchedulerImpl.java:50) 在 com.google.gwt.core.client.impl.SchedulerImpl.runScheduledTasks(SchedulerImpl.java:228) 在 com.google.gwt.core.client.impl.SchedulerImpl.flushFinallyCommands(SchedulerImpl.java:327) 在 com.google.gwt.core.client.impl.Impl.exit(Impl.java:266) 在 com.google.gwt.core.client.impl.Impl.entry0(Impl.java:257) 在 sun.reflect.GeneratedMethodAccessor24.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103) 在 com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71) 在 com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172) 在 com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:293) 在 com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:547) 在 com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364) 在 java.lang.Thread.run(Unknown Source)

我不确定它为什么要将订单强制转换为字符串。我觉得我在这里缺少关于序列化的一些基本知识,有人能指出我正确的方向吗?

【问题讨论】:

你有 .gwt.xml 文件@com/cbs/ioma/ 文件夹吗?是否与 com.cbs.ioma.client.Order 的 .java 文件一起包含在您的 jar 中? 如果您指的是 WAR 文件,我在 WAR 文件中有 xml 文件。我需要第二个吗?我的 order.java 在 com.cbs.ioma.client 【参考方案1】:

尝试实现IsSerializable 而不是Serializable。但总的来说,您的代码应该可以工作。这个错误有时会发生(在调试期间),但在大多数情况下,它在重新编译后会起作用。

【讨论】:

是的,你应该实现 gwt rpc 的 isSerializable 而不是 java serializable。【参考方案2】:

为了允许使用GWT-RPC 将您的数据类型从/从客户端传输到/从服务器传输,您需要通过实现IsSerializable 或@987654327 将它们标记为可序列化 @ 界面。您还必须确保类字段的可序列化性(最终/瞬态字段除外,它们根本不会被序列化)以及默认零参数构造函数的存在(或根本没有)。

编辑:最终字段的序列化实际上是在review 下。

如果由于某种原因,您无法满足这些要求,您需要使用DTOs 填充您的对象数据,以便将它们传输到/从客户端/服务器传输。或者您可以尝试为该类实现自己的custom serializer。

如果需要,请查看docs for GWT serialization 和java.io.Serializable support。并且还要清理你的 war 目录中的所有 *.gwt.rpc 文件,以强制重新创建序列化策略。

【讨论】:

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

GWT - 从 FormPanel 上传文件后返回对象?

GWT-RPC 和不可变传输对象

使用 GWT RPC 序列化在 POST 中将对象从客户端发送到服务器

GWT RPC 序列化和循环引用——先有鸡还是先有蛋的问题

当我使用 ArrayList 时,如何防止 GWT 尝试包含每个可序列化的类

如何使用 GWT 序列化流工厂