При попытке десериализации файла java.math.BigDecimal появляется следующая ошибка:
java.io.InvalidClassException: java.math.BigDecimal; local class incompatible:
stream classdesc serialVersionUID = 6108874887139371087,
local class serialVersionUID = 6108874887143696463
Я знаю, что эта ошибка может произойти, если вы реализуете интерфейс Serializable без определения serialVersionUID
, но мой класс его определяет:
public class Foo implements java.io.Serializable {
private static final long serialVersionUID = -2280646288949622888L;
private int a;
private long b;
private java.lang.String c;
private java.math.BigDecimal d;
}
Кроме того, он жалуется конкретно на BigDecimal, который является частью JDK, а также определяет serialVersionUID
, если я доверяю декомпилятору Eclipse:
private static final long serialVersionUID = 6108874887143696463L;
Я читал, что в некоторых случаях (например, с использованием GWT) , у вас могут быть разные реализации класса BigDecimal с разными последовательными версиями, которые могут избежать правильной десериализации. Это также может случиться с разными версиями одного и того же класса на разных машинах. Но в моем случае я выполняю сериализацию и десериализацию на одной машине, в том же экземпляре JBoss ...
Глядя на этот похожий вопрос , я думаю, что должна быть проблема с моим процессом сериализации, но я не могу понять это. Это код, который я использую:
static InputStream serialize(Foo[] array) throws IOException {
ByteArrayOutputStream baos = null;
ObjectOutputStream oos = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(array);
return new ByteArrayInputStream(baos.toByteArray());
} finally {
close(oos);
close(baos);
}
}
static Foo[] deserialize(InputStream is) throws IOException, ClassNotFoundException {
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(is);
return (Foo[]) ois.readObject();
} finally {
close(ois);
}
}
Редактировать : Я забыл упомянуть, что данные хранятся на диске после сериализации и читаются оттуда перед десериализацией. Так что, может быть, именно здесь это искажается. Для чтения я просто использую new FileInputStream(file)
. Чтобы написать, я использую это:
static void write(File file, InputStream is) throws IOException {
FileWriter fw = null;
InputStreamReader isr = null;
try {
fw = new FileWriter(file, true);
isr = new InputStreamReader(is);
char[] buffer = new char[8096];
int bytesRead;
while ((bytesRead = isr.read(buffer)) != -1) {
fw.write(buffer, 0, bytesRead);
}
} finally {
close(fw);
close(isr);
}
}
Может быть, потому что я использую char[]
в качестве буфера, но входной поток был сгенерирован из byte[]
? Это не должно быть проблемой, верно?