Не удается найти причину исключения java.io.OptionalDataException в моем коде - PullRequest
1 голос
/ 05 марта 2012

Я пытаюсь сериализовать объект и сохранить его на 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)

Ответы [ 2 ]

5 голосов
/ 07 марта 2012

Я решил проблему, и мне стыдно сказать, что это потому, что Я забыл реализовать Serializable в одном классе, который редко использовался.Вот почему это обычно де / сериализовано нормально.Только когда присутствовал экземпляр этого класса, все пошло не так.

0 голосов
/ 05 марта 2012

Есть ли у вас Коллекции или Наборы или подобные структуры данных, которые не синхронизированы должным образом, если у вас есть и если у вас есть другие потоки, обращающиеся к ним, которые могут вызвать эту ошибку.

...