オブジェクトをシリアル化し、ファイルとして HDD に保存します。私がそれを読んでいるとき、いくつかの場合にのみEOFExceptionをスローします。数時間のデバッグの後、問題を見つけることができません。
これが私のコードです:
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);
}
}
}
}
オブジェクトを取得する場合:
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;
}
スタックトレース:
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1273) で java.io.ObjectInputStream.readObject(ObjectInputStream.java: 348) java.util.LinkedList.readObject(LinkedList.java:776) で sun.reflect.GeneratedMethodAccessor583.invoke(不明なソース) で sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) で java.lang.reflect で.Method.invoke(Method.java:585) で java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:946) で java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1809) で java.io.ObjectInputStream.readOrdinaryObject( ObjectInputStream.java:1719) で java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305) で java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1908) で java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1832) で java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1719) で java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1719) でio.ObjectInputStream.readObject0(ObjectInputStream.java:1305) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
質問:
シリアライズされたオブジェクトが壊れてしまいましたが、これはゴミですか?
このオブジェクトは、ユーザーが保存した UI のレンダリングを担当するためです。ユーザーがログインすると、以前に保存した UI の状態をレンダリングする必要があります。ただし、一部のユーザーでは、ファイルを逆シリアル化できません。