16

アイテムをフィルタリングするためのインターフェースがあります:

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);
}

および type のメンバーを含むクラスKeyValFilter

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

KeyValFilterCollectorを実装する匿名クラスでを開始しようとすると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:");
        }
});

例外が発生します: Exception in thread "main" java.io.NotSerializableException.

作成した匿名クラスをシリアライズ可能にするにはどうすればよいですか?

4

3 に答える 3

28

Joshua Bloch は、著書『Effective Java, 2nd Edition』の Item 74に次のように書いています。

内部クラスは実装しないでくださいSerializable。それらは、コンパイラによって生成された合成フィールドを使用して、囲んでいるインスタンスへの参照を格納し、囲んでいるスコープからのローカル変数の値を格納します。これらのフィールドがクラス定義にどのように対応するかは、匿名クラスとローカル クラスの名前と同様に規定されていません。したがって、内部クラスのデフォルトのシリアライズ形式は illdefinedです。ただし、静的メンバー クラスは を実装できますSerializable

于 2013-07-23T08:25:26.587 に答える
0

匿名クラスをシリアライズ可能と宣言できますが、そのすべてのフィールドがシリアライズ可能である場合にのみ、クラスは実際にシリアライズ可能になります。

例を参照してください。

public static void main(String[] args) throws Exception {
    Object myObj = new Serializable() {
        private static final long serialVersionUID = 1L;
        private String str = "something";
        private Object ns = new Object(){};
    };
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(myObj);
    oos.close();
    System.out.println("Success!");
}

行にコメントすると

private Object ns = new Object(){};

コードは成功して終了しました。それ以外の場合NotSerializableExceptionはスローされます。

于 2013-07-23T09:31:22.367 に答える