本文介绍了匿名类上的 NotSerializableException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个过滤项目的界面:

I have an interface for filtering items:

public interface KeyValFilter extends Serializable {
    public static final long serialVersionUID = 7069537470113689475L;
    public boolean acceptKey(String iKey, Iterable<String> iValues);
    public boolean acceptValue(String iKey, String value);
}

和一个包含 KeyValFilter 类型成员的类.

and a class containing a member of type KeyValFilter.

public class KeyValFilterCollector extends KeyValCollectorSkeleton {
    private static final long serialVersionUID = -3364382369044221888L;
    KeyValFilter filter;
    public KeyValFilterCollector(KeyValFilter filter) {
        this.filter=filter;
    }
}

当我尝试使用实现 KeyValFilter 的匿名类启动 KeyValFilterCollector 时:

When I try to initiate the KeyValFilterCollector with an anonymous class implementing KeyValFilter:

new KeyValFilterCollector(new KeyValFilter() {
        private static final long serialVersionUID = 7069537470113689475L;
        public boolean acceptKey(String iKey, Iterable<String> iValues) {
            for (String value : iValues) {
                if (value.startsWith("1:"))
                        return true;
            }
            return false;
        }
        public boolean acceptValue(String iKey, String value) {
            return value.startsWith("0:");
        }
});

我收到一个异常:线程main"java.io.NotSerializableException 中的异常.

如何让我写的匿名类可以Serializable?

How do I make the anonymous class I wrote Serializable?

推荐答案

Joshua Bloch 在他的书中写道 EffectiveJava,第 2 版,第 74 项:

Joshua Bloch writes in his book Effective Java, 2nd Edition, Item 74:

内部类不应实现Serializable.它们使用编译器生成的合成字段来存储对封闭实例的引用,并存储来自封闭作用域的局部变量的值.这些字段如何对应于类定义是未指定的,匿名类和本地类的名​​称也是如此.因此,内部类的默认序列化形式是不明确的.但是,静态成员类可以实现Serializable.

这篇关于匿名类上的 NotSerializableException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-08 04:36