java - java序列化错误

标签 java serialization

我想使用java的ByteArrayOutputStream序列化一个类:

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)

请问哪里出了问题?我序列化一个类,但它向我显示一个错误! :(

最佳答案

它提示一个匿名内部类导致了这个问题,而你只有一个匿名内部类,所以我相信你可以通过创建 UniqueTagGenerator 来解决这个问题。实现Serializable .

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

解决这个问题的另一种方法——更好,IMO——是将标签生成器实现与 UniqueTag 分开。 。要么创建一个单独的类,要么将工厂方法添加到 UniqueTagGenerator .

关于java - java序列化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12586186/

相关文章:

java - 有没有办法将可序列化的对象读/写到 RandomAccessFile?

android - 让 Kotlin Serializer 与 Retrofit 一起工作

在ASP.NET中拒绝用户时, 'CustomIdentity'上的SerializationException

java - 使用 Sockets 在客户端和服务器之间传输 HashMap (JAVA)

java - 我在此代码中返回一个字符串数组,但它仍然表示此方法必须返回 String 类型的结果。为什么?

java - 如何将 HashMap 的键设置为 XML 文件中的标签?

java - invokeAll() 不愿意接受 Collection<Callable<T>>

c++ - 用于枚举序列化的函数模板

java - JPA-存储库保存 : Proceed saving after insert Constraint violation

javascript - 奇怪的日期格式帮助