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

它抱怨是一个匿名内部类导致了这个问题,而你只有一个匿名内部类,所以我相信你可以通过UniqueTagGenerator实现来解决问题Serializable

我不完全确定为什么会抛出此异常,因为UniqueTag不应包含对创建它的生成器的任何引用。我怀疑正在进行一些不必要的类引用追逐(或者您没有显示确切的代码)。

另一种修复它的方法——更好的是,IMO——是将标签生成器实现与UniqueTag. 要么创建一个单独的类,要么将工厂方法添加到UniqueTagGenerator.

于 2012-09-25T15:44:16.357 回答
2

你的类应该有一个可访问的无参数构造函数。您的最终字段也不会被初始化。查看可序列化的文档,这可能会有所帮助。

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

于 2012-09-25T15:41:23.360 回答