Como evitar que InputStream.readObject () lance EOFException?
Eu serializo um objeto e salvá-lo como um arquivo no meu disco rígido. Quando eu estou lendo, em algumas ocasiões ele jogaEOFException. Após algumas horas de depuração, não consigo encontrar um problema.
Aqui está o meu código:
public void serialize(MyClass myClass,String path) {
FileOutputStream foStream = null;
ObjectOutputStream ooStream = null;
try {
File file = new File(path);
if (!file.exists()) {
file.createNewFile();
}
foStream = new FileOutputStream(file);
ooStream = new ObjectOutputStream(foStream);
ooStream.writeObject(myClass);
} catch (Throwable t) {
log.error(t);
} finally {
if (ooStream != null) {
try {
ooStream.flush();
ooStream.close();
} catch (IOException e) {
log.error(e);
}
}
}
}
Para obter o objeto:
public MyClass deSerialize(String path) {
MyClass myClass=null;
FileInputStream fiStream = null;
ObjectInputStream oiStream = null;
String errorMessage = "";
try {
File file = new File(path);
if (!file.exists()) {
return null;
}
fiStream = new FileInputStream(path);
oiStream = new ObjectInputStream(fiStream);
Object o = oiStream.readObject();
myClass = (MyClass) o;
} catch (Throwable t) {
log.warn(t);
} finally {
if (oiStream != null) {
try {
oiStream.close();
} catch (IOException e) {
log.error(e);
}
}
}
return myClass;
}
Stacktrace:
java.io.EOFException em java.io.ObjectInputStream $ BlockDataInputStream.peekByte (ObjectInputStream.java:2498) em java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1273) em java.io.ObjectInputStream.readObject (ObjectInputStream.java: 348) em java.util.LinkedList.readObject (LinkedList.java:776) em sun.reflect.GeneratedMethodAccessor583.invoke (Unknown Source) em sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) em java.lang.reflect .Method.invoke (Method.java:585) em java.io.ObjectStreamClass.invokeReadObject (ObjectStreamClass.java:946) em java.io.ObjectInputStream.readSerialData (ObjectInputStream.java:1809) em java.io.ObjectInputStream.readOrdinaryObject ( ObjectInputStream.java:1719) em java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1305) em java.io.ObjectInputStream.defaultReadFields (ObjectInputStream.java:1908) em java.io.ObjectInputStream.readSerialData (ObjectInputStream.java:1832 ) em java.io.ObjectInputStream.readOrdinaryObject ( ObjectInputStream.java:1719) em java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1305) em java.io.ObjectInputStream.readObject (ObjectInputStream.java:348)
Questão: Meu objeto serializado está corrompido e agora é lixo agora?
Porque esse objeto é responsável por renderizar a interface do usuário que foi salva pelo usuário. Se o usuário efetuar login, deverá renderizar o estado da interface do usuário salvo anteriormente. No entanto, para alguns usuários, o arquivo não pode ser desserializado.