2014-02-20 5 views
1

Я искал ответа на этот вопрос, но никто из других ответов не работал для меня. Я использую сериализацию в android, и я сериализую один объект. Проблема в том, что когда я десериализую это, я получаю EOFException и объект не загружается. Моя экономия код:EOFException при чтении сериализованного файла в Android

FileOutputStream fileOut = null; 
try { 
    fileOut = context.openFileOutput("state.ser", Context.MODE_PRIVATE); 
    ObjectOutputStream out = new ObjectOutputStream(fileOut); 
    out.writeObject(MyObject); 
    out.close(); 
    fileOut.close(); 
} catch (IOException i) { 
    i.printStackTrace(); 
} 

Моя загрузка класса, который бросает это исключение:

FileInputStream fis; 
try { 
    fis = context.openFileInput("state.ser"); 
    ObjectInputStream is = new ObjectInputStream(fis); 
    myObject = (MyObject) is.readObject(); //exception thrown from here 
    is.close(); 
} catch (FileNotFoundException e) { 
    generateMyObject(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

Определение моего объекта:

public class MyObject implements Serializable { 
    private static final long serialVersionUID = 155986L; 
    public MyInnerObject[][] mio = null; 
    public Boolean[] unassigned = null; 
} 
public class MyInnerObject implements Serializable { 
    private static final long serialVersionUID = 1L;  
    public boolean[] legals; 
    public int ID; 
    public int pos; 
} 

Что я делаю неправильно? Спасибо за все ответы.

EDIT: трассировка стека

java.io.EOFException 
java.io.DataInputStream.readBoolean(DataInputStream.java:69) 
java.io.ObjectInputStream.readNewArray(ObjectInputStream.java:1462) 
java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:760) 
java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981) 
java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938) 
java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1115) 
java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455) 
java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1347) 
java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1244) 
java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1833) 
java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:762) 
java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981) 
java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938) 
java.io.ObjectInputStream.readNewArray(ObjectInputStream.java:1490) 
java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:760) 
java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981) 
java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938) 
java.io.ObjectInputStream.readNewArray(ObjectInputStream.java:1490) 
java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:760) 
java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981) 
java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938) 
java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1115) 
java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455) 
java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1347) 
java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1244) 
java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1833) 
java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:762) 
java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981) 
java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938) 
com.example.myApp.Cell.loadState(Cell.java:224) 
... rest is only where in app it appeared 

Кроме того, даже, что это только предупреждение, объект не загружается, так что я не могу использовать его.

+0

Вы также должны опубликовать трассировку стека. –

+0

Извините, что я добавил его в редакцию. – Rasputin

ответ

0

Я не знаю, может ли это вам помочь, но here говорит, что сериализация в Android может быть ошибкой с большими массивами целых чисел. В вашем случае у вас есть массив булевых элементов, который в любом случае является целым.

Я бы попытался выполнить тесты, удалив некоторые сериализуемые данные (например, сериализуя только часть информации), чтобы увидеть, связана ли проблема с массивами.

Кроме того, это может быть очевидно, но, возможно, не ... убедитесь, что вы не загружаете файл, который был сохранен с другой версией вашего объекта (например, вы сохранили объект, выполняющий некоторый тест, затем вы добавили переменные для вашего класса, и теперь вы пытаетесь де-сериализовать).

+0

Это может быть так. Если я посчитаю все переменные, которые я сохраняю, это занимает около 300 000 логических значений. Я попробую найти другое представление состояния или, по крайней мере, не использовать целые числа. Большое спасибо, я бы никогда об этом не подумал. Я отредактирую, когда я его разрешу. – Rasputin

+0

@ user3294807 Что-то, что вы могли попробовать, заменяет массивы [] для ArrayList, который использует интерфейс Serializable. – Merlevede

+0

Я изменил свою модель, поэтому большинство логических вычислений вычисляются так, как они нужны, и теперь я сохраняю только 700 булевых и Все отлично. Я очень ценю вашу помощь, я бы не решил ее без вас. Спасибо – Rasputin

0

Файл пуст или короткий. У вас должно быть исключение при его создании.

+0

Нет, это меня беспокоит. Я перепроверял его, а также распечатал «info» в попытке сохранить и «информация» вышла (я видел ее на консоли), но не исключение. – Rasputin

 Смежные вопросы

  • Нет связанных вопросов^_^