我不能在 GWT Collections.unmodifiableList(List l) 中使用来使我的列表只可读,因为不是可序列化的替代方法吗?

Posted

技术标签:

【中文标题】我不能在 GWT Collections.unmodifiableList(List l) 中使用来使我的列表只可读,因为不是可序列化的替代方法吗?【英文标题】:I can't use in GWT Collections.unmodifiableList(List l) to make only readable my List, because isn't serializable, alternative ways? 【发布时间】:2015-06-09 23:37:57 【问题描述】:

我正在使用 GWT-RPC 创建一个应用程序。在某些时候,服务器使用 Collections.unmodifiableList(List l) 返回一个 Collection 给客户端。客户端报错:

[WARN] Exception while dispatching incoming RPC call
com.google.gwt.user.client.rpc.SerializationException: Type 'java.util.Collections$UnmodifiableList' 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

所以,我需要另一种方法来获取唯一可读的集合,我该怎么做?非常感谢

我的代码如下:

    try 
        LinkedList all=new LinkedList();
        while(res.next())
            all.add(objectFromCursor(res));
        
        return Collections.unmodifiableList(all);
     catch (SQLException e) 
        throw new ExceptionHandler("Error: "+e.getMessage());
    



private static Film objectFromCursor(ResultSet res) throws SQLException
    Film film=new Film(res.getString(1));
    film.setRegista(res.getString(2));
    film.setAnnoDiProduzione(res.getInt(3));
    return film;

【问题讨论】:

为什么需要通过 GWT-RPC 传递不可修改的列表?列表一旦到达客户端就会与服务器实例分离,即客户端修改不会传播到服务器(除非您在另一个 GWT-RPC 请求中将其发送回)。 【参考方案1】:

一个不可修改的可序列化集合本身似乎是一个矛盾。为了反序列化一个对象(我认为“可序列化”暗示“可序列化”),它必须是可修改的。

所以只需使用可修改的集合来通过 GWT-RPC 传递。

【讨论】:

【参考方案2】:

您可以使用番石榴中的 ImmutableCollections。 https://github.com/google/guava/wiki/ImmutableCollectionsExplained

Guava (link to their Github Page) 是来自 Google 的 Java 实用程序库,但他们也为 GWT 制作了一个版本。要在您的项目中使用 ImmutableCollections,请将 guava-gwt 添加到您的项目并继承

<inherits name="com.google.common.collect.Collect"/>

【讨论】:

以上是关于我不能在 GWT Collections.unmodifiableList(List l) 中使用来使我的列表只可读,因为不是可序列化的替代方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算 GWT 2.3 中的指数?

GWT 中的 IsSerializable 是啥?

如何在 GWT 中使用 autobean 将 json 转换为 java 类

使用 GWT RemoteServiceServlet 下载文件

使用 GWT 编译器的 Java 到 JavaScript

GWT JPA - 无法反序列化响应