【问题标题】:Is there a standard closure interface that is Serializable?是否有可序列化的标准闭包接口?
【发布时间】:2010-10-15 15:51:48
【问题描述】:

如果不是,也许你可以告诉我原因。

当我的类被序列化时,我得到 NotSerializableException。

在类内部,我将这个匿名类传递给一个方法:

new org.apache.commons.collections.Closure() {
   ...
};

这个问题仍然没有答案。我想知道是否有实现Serializable的标准Closure接口

【问题讨论】:

  • 闭包不是 Java 语言规范的一部分,因此没有标准的闭包。

标签: java serialization closures


【解决方案1】:

类中的所有引用也必须是 Serializable 类型,即使是 Closure 类型。是接口吗?它必须扩展 java.io.Serializable 接口。

即:

interface Closure extends java.io.Serializable {
    ...
}

class YourClass implements java.io.Serializable {
    private Closure closure;
    ...
    public void setClosure(Closure closure) {
        this.closure = closure;
    }
}
...
    private static void main(String[] args) {
        YourClass y = new YourClass();
        y.setClosure(new Closure() {
            ...
        });
        ...

编辑,澄清。 :)

【讨论】:

  • 基类不需要是可序列化的(尽管最派生的不可序列化类必须具有可由最基类可序列化类访问的无参数构造函数。
  • 我正在使用 apache 的 Closure 接口。我想知道为什么它不实现 Serializable。
【解决方案2】:

这里的主要问题是嵌套类没有标准化的序列形式。另请注意,如果您在实例方法中,外部类对象也将被序列化(通过未指定名称的字段)。

如果您不关心您的代码是否在完全随机的点停止工作,您可能需要考虑一个普通的本地类来代替(或除此之外)匿名内部类。

【讨论】:

  • 你是对的。 “Findbugs”也在警告我:模式 id:SE_INNER_CLASS,类型:Se,类别:BAD_PRACTICE 这个 Serializable 类是一个内部类。任何对其进行序列化的尝试也将序列化相关的外部实例 [...]
【解决方案3】:

是否有标准的闭包接口 那是可序列化的?

我猜不是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2011-07-10
    • 1970-01-01
    相关资源
    最近更新 更多