2

ByteArrayOutputStreamJavaを使用してクラスをシリアライズしたい:

public void serializ(UniqueTag m) throws IOException {
        ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
        ObjectOutputStream stream = new ObjectOutputStream(byteOutput);
            stream.writeObject(m);

        stream.flush();
        stream.close();
        byteOutput.flush();
        byteOutput.close();    
    }

シリアライズしたいクラス:

import java.io.Serializable;

public class UniqueTag implements Comparable<UniqueTag>, Serializable {
    public final static UniqueTag MIN = new UniqueTag(Integer.MIN_VALUE,
            Integer.MIN_VALUE);
    public final static UniqueTag MAX = new UniqueTag(Integer.MAX_VALUE,
            Integer.MAX_VALUE);

    private final int replicaId;
    private final int counter;

    public static UniqueTagGenerator createGenerator() {
        return new UniqueTagGenerator() {
            int currentStamp;

            @Override
            public UniqueTag nextTag(final int replicaId) {
                return new UniqueTag(replicaId, currentStamp++);
            }
        };
    }

    public UniqueTag(final int replicaId, final int counter) {
        this.replicaId = replicaId;
        this.counter = counter;
    }

    public int getReplicaId() {
        return replicaId;
    }

    public int getCounter() {
        return counter;
    }

    @Override
    public int compareTo(UniqueTag o) {
        if (replicaId != o.replicaId) {
            return replicaId - o.replicaId;
        }
        return counter - o.counter;
    }

    public UniqueTag clone() {
        return new UniqueTag(replicaId, counter);
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof UniqueTag))
            return false;
        final UniqueTag other = (UniqueTag) obj;
        return counter == other.counter && replicaId == other.replicaId;
    }

    @Override
    public String toString() {
        return "(" + replicaId + "," + counter + ")";
    }
}

私はこのエラーがあります:

Exception in thread "main" java.io.NotSerializableException: jbenchmarker.treedoc.UniqueTag$1
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)

どこに問題がありますか? クラスをシリアライズしますが、エラーが表示されます! :(

4

2 に答える 2

3

匿名の内部クラスが問題を引き起こしていると不平を言っており、匿名の内部クラスが1つしかないので、UniqueTagGenerator実装することで問題を解決できると思いますSerializable

のインスタンスは、それを作成したジェネレーターへの参照を保持してはならないため、この例外がスローされる理由は完全にはわかりません。UniqueTagクラス参照の不必要な追跡が行われていると思われます (または、正確なコードを表示していません)。

それを修正する別の方法 (IMO の方がよい) は、タグ ジェネレーターの実装を から分離することUniqueTagです。別のクラスを作成するか、ファクトリ メソッドを に追加しUniqueTagGeneratorます。

于 2012-09-25T15:44:16.357 に答える
2

クラスには、アクセス可能な引数なしのコンストラクターが必要です。また、最終フィールドは初期化されません。serializable のドキュメントを見てください。役立つかもしれません。

http://docs.oracle.com/javase/6/docs/api/java/io/Serializable.html

于 2012-09-25T15:41:23.360 に答える