我想使用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/