【问题标题】:Gwt serializationgwt序列化
【发布时间】: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://stackoverflow.com/a/3060233/595072
  • 我们使用ArrayList&lt;Serializable&gt; 而不是ArrayList&lt;Object&gt;。您会收到 GWT 编译警告,但这没关系。

标签: java gwt jdbc


【解决方案1】:

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

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

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

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

【讨论】:

【解决方案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 查询,所以我现在不知道它在运行前将持有什么类型
猜你喜欢
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多