Я пытаюсь сериализовать объект и сохранить его на SD-карте. По сути, я сохраняю состояние игры. Поэтому я просто сериализую один объект с именем GameState, который сам содержит различные другие объекты и примитивы, все объекты сериализуемы.
Теперь сериализация и сохранение файла работает нормально. Нет ошибок или исключений в logcat. Однако примерно в пятидесяти процентах случаев при попытке десериализации GameState я получаю исключение, java.io.OptionalDataException.
Мой метод десериализации выглядит так:
...
try {
File sdCard = Environment.getExternalStorageDirectory();
instream = new FileInputStream(sdCard.getAbsolutePath()+"/my_app/saved_game");
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
try {
ObjectInputStream ois = new ObjectInputStream(instream);
try {
g= (GameState) ois.readObject();
try {
instream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return g;
} catch (ClassNotFoundException ex) {
return null;
}
} catch (StreamCorruptedException ex) {
return null;
} catch (IOException ex) {
return null;
}
То, что я не могу понять, это то, почему это иногда терпит неудачу. Я реализовал аналогичные методы де / сериализации в других приложениях без проблем, поэтому я запутался. GameState не содержит статических или переходных полей.
Это logcat
03-05 23: 18: 35.458: WARN / System.err (7588):
java.io.OptionalDataException 03-05 23: 18: 35.458:
WARN / System.err (7588): в
java.io.ObjectInputStream.readNonPrimitiveContent (ObjectInputStream.java:966)
03-05 23: 18: 35.458: WARN / System.err (7588): в
java.io.ObjectInputStream.readObject (ObjectInputStream.java:2299)
03-05 23: 18: 35.458: WARN / System.err (7588): в
java.io.ObjectInputStream.readObject (ObjectInputStream.java:2254)
03-05 23: 18: 35.468: WARN / System.err (7588): в
java.util.ArrayList.readObject (ArrayList.java:674) 03-05 23: 18: 35.468:
WARN / System.err (7588): в
java.lang.reflect.Method.invokeNative (родной метод) 03-05
23: 18: 35.468: WARN / System.err (7588): в
java.lang.reflect.Method.invoke (Method.java:521) 03-05 23: 18: 35.468:
WARN / System.err (7588): в
java.io.ObjectInputStream.readObjectForClass (ObjectInputStream.java:1551)
03-05 23: 18: 35.468: WARN / System.err (7588): в
java.io.ObjectInputStream.readHierarchy (ObjectInputStream.java:1474)
03-05 23: 18: 35.468: WARN / System.err (7588): в
java.io.ObjectInputStream.readNewObject (ObjectInputStream.java:2153)
03-05 23: 18: 35.468: WARN / System.err (7588): в
java.io.ObjectInputStream.readNonPrimitiveContent (ObjectInputStream.java:943)
03-05 23: 18: 35.468: WARN / System.err (7588): в
java.io.ObjectInputStream.readObject (ObjectInputStream.java:2299)
03-05 23: 18: 35.468: WARN / System.err (7588): в
java.io.ObjectInputStream.readObject (ObjectInputStream.java:2254)
03-05 23: 18: 35.468: WARN / System.err (7588): в
java.io.ObjectInputStream.readFieldValues (ObjectInputStream.java:1319)
03-05 23: 18: 35.468: WARN / System.err (7588): в
java.io.ObjectInputStream.defaultReadObject (ObjectInputStream.java:540)
03-05 23: 18: 35.468: WARN / System.err (7588): в
java.io.ObjectInputStream.readObjectForClass (ObjectInputStream.java:1566)
03-05 23: 18: 35.468: WARN / System.err (7588): в
java.io.ObjectInputStream.readHierarchy (ObjectInputStream.java:1474)
03-05 23: 18: 35.468: WARN / System.err (7588): в
java.io.ObjectInputStream.readNewObject (ObjectInputStream.java:2153)