1

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

类型 'com.cbs.ioma.client.Order' 未包含在可由此 SerializationPolicy 序列化的类型集中,或者无法加载其 Class 对象。出于安全考虑,此类型不会被序列化。: instance = Order [orderNumber=1001, orderer=test, assembler=1, dateCompleted=1969-12-31, dateSubmitted=1969-12-31, notes=rer, isComplete=假,类型=错误]

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

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 无法在 com.google.gwt.text.shared.SimpleSafeHtmlRenderer.render(SimpleSafeHtmlRenderer.java:1) 中转换为 java.lang.String。 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(Unknown Source) 在 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。com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:293) 上 com.google.gwt.dev.shell 上的 google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)。 BrowserChannelServer.processConnection(BrowserChannelServer.java:547) at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364) at java.lang.Thread.run(Unknown Source)

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

4

2 回答 2

2

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

于 2013-04-19T04:07:50.630 回答
1

In order to allow your data types to be transferred from/to client to/from server using GWT-RPC, you need to mark them as serializable by implementing either the IsSerializable or Serializable interface. You also have to ensure the serializability of the class fields (except final/transient fields, which will not be serialized at all) and the presence of a default zero-arg constructor (or none at all).

EDIT: Serialization of final fields is actually under review.

If, for some reason, you cannot meet those requirements, you need to use DTOs filled with your object data, in order to transport them to/from the client/server. Or you can try to implement your own custom serializer for that class.

Take a look at the docs for GWT serialization and to the java.io.Serializable support if you want. And also clean all *.gwt.rpc files in your war dir, to force the re-creaton of the serialization policy.

于 2013-04-19T08:10:36.610 回答