gwt序列化

Posted

技术标签:

【中文标题】gwt序列化【英文标题】:Gwt serialization 【发布时间】:2011-12-08 16:30:36 【问题描述】:

我有一个类Data,它实现了Serializable 接口。这个类有这样的字段

    private boolean q = false;
    private String a = "";
    private List<Someclass> m = Collections.emptyList();
    private List<Object[]> d = Collections.emptyList();

分配给这些成员的值是默认值。 Someclass 类也实现了 Serializable 并且它有这样的列

   private Types sqlType;
    private int columnWidth;
    private String columnName;

Types 是一个也实现可序列化的枚举。

Data 类中,我有List&lt;Object[]&gt; d,我将在其中保存通过jdbc 从数据库获取的数据(迭代ResultSet 时我使用getObject() 方法)。我使用这种结构,因为它可以运行任何查询(查询的结构未知)。在List&lt;Someclass&gt; m 我持有查询元数据。因此,当我尝试使用简单查询获取行时,我得到了

com.google.gwt.user.client.rpc.SerializationException: Type '[Ljava.lang.Object;' 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 = [Ljava.lang.Object;@127053a9

为什么会发生?我所有的传输对象都是可序列化的。

编辑 好的,Object 不是可序列化的,因此它不能传递给服务器并从服务器返回。但是在这种情况下我应该使用什么。泛型对我没有帮助,因为我在编译时不知道类型

【问题讨论】:

不管Object是不可序列化的,在RPC调用中最好使用ArrayList而不是List。见http://***.com/a/3060233/595072 我们使用ArrayList&lt;Serializable&gt; 而不是ArrayList&lt;Object&gt;。您会收到 GWT 编译警告,但这没关系。 【参考方案1】:

为了使该类可序列化,基本上您可以从中获取的所有内容也必须是可序列化的。在这种情况下 Object 不可序列化,这使得 Object[] 不可序列化,这使得 List 不可序列化,这使得 Data 不可序列化。

这样想:如果不能序列化 Object[] 中的给定 Object,你将如何序列化 Object[]?如果你不能序列化它,你将如何序列化它的列表?如果你不能序列化该列表,你将如何序列化包含该列表的东西?

现在,可能是您的 Object[] 中的所有内容最终都可以序列化——但您输入它的方式,编译器无法保证这一点。

编辑:关于你应该改用什么,我会创建某种包装类来保存 SQL 查询的结果,并使其可序列化。

【讨论】:

但我尝试将数据对象序列化为文件,并且它序列化得很好。 gwt 是否使用另一种序列化? @maks 是的,GWT RPC 不执行正常的 Java 序列化。见code.google.com/webtoolkit/doc/latest/… 和code.google.com/webtoolkit/doc/latest/…【参考方案2】:

这里不能使用 List,因为 Object[] 不可序列化。

您需要创建一个不同的、可序列化的类,该类可以保存您从查询中获得的任何列值。

可能是这样的:

public abstract class ColumnValue implements Serializable

    public abstract Object getValue();


public class IntColumnValue extends ColumnValue

    private Integer _intValue;
    public Object getValue()
    
         return _intValue;
    


.
.
.

您为每个可能返回的列类型创建一个 ColumnValue 的子类。当你有一个 Object[] 数组时,你将它移动到一个 ColumnValue[] 数组中,根据查询中的元数据为每个值选择正确的子类型。

【讨论】:

在您的示例中,您将成员变量 _intValue 声明为整数,但正如我所说,用户可以输入任何 sql 查询,所以我现在不知道它在运行前将持有什么类型

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

如何使用 GWT 序列化流工厂

GWT 序列化异常

GWT 中的 BigDecimal 序列化

GWT 序列化问题

GWT 客户端 RPC 请求序列化

如何序列化 AutoBean (GWT) 中的列表?