Проблемы с вводом-выводом с android (в основном ObjectInputStream)

Впервые размещаю здесь пост, так что не беспокойтесь!

Пытаясь создать метод, который читает в omw.data, проверяет, существует ли уже объект SavedSession в файле. Если это так, игнорируйте его, в противном случае добавьте его в конец файла.

Я могу добавить один объект, при добавлении того же SavedSession он работает правильно, говоря, что он уже добавлен. При добавлении другого типа SavedSession он говорит, что он добавлен, но при попытке прочитать omw.data он выдает

java.io.StreamCorruptedException: неправильный формат: ac

SavedSession не содержит объект GeoPoint, а просто использует его для получения широты и долготы.

Любая помощь будет признательна. Я действительно пробовал искать и пробовал довольно много разных методов или не совсем понимал, в чем проблема.

Спасибо, если я что-то упустил, дайте мне знать, и я сразу все заплачу.

public void saveDestination(GeoPoint to, String message,
        List<String> contactNumbers) throws IOException {
    SavedSession newSession = new SavedSession(to, message, contactNumbers);

    FileOutputStream fos = c.openFileOutput("omw.data", Context.MODE_APPEND);
    fos.close();

    FileInputStream fis = c.openFileInput("omw.data");      

    try {
        ObjectInputStream ois = new ObjectInputStream(fis);
        List<SavedSession> previousSessions = new LinkedList<SavedSession>();           

        try {
            Object prevSession = null;
            while ((prevSession = ois.readObject()) != null) {
                previousSessions.add((SavedSession) prevSession);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch(EOFException ex){
            System.out.println("End of file reached found: " + previousSessions.size());
        }
        finally {
            System.out.println("ois closed");
            ois.close();
        }

        if (previousSessions.contains(newSession)) {
            Toast.makeText(c, "Already contained!", Toast.LENGTH_LONG)
                    .show();
            return;
        }

    } catch (EOFException ex) {
        ex.printStackTrace();
    }

    fos = c.openFileOutput("omw.data", Context.MODE_APPEND);        

    ObjectOutputStream oos = new ObjectOutputStream(fos);

    oos.writeObject(newSession);
    oos.flush();
    oos.close();        


    Toast.makeText(c, "Added Item", Toast.LENGTH_LONG).show();

}

Ошибки

03-03 01:56:27.452: W/System.err(3631): java.io.StreamCorruptedException: Wrong format: ac
03-03 01:56:27.452: W/System.err(3631):     at java.io.ObjectInputStream.corruptStream(ObjectInputStream.java:830)
03-03 01:56:27.452: W/System.err(3631):     at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:943)
03-03 01:56:27.462: W/System.err(3631):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2262)
03-03 01:56:27.462: W/System.err(3631):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2217)
03-03 01:56:27.462: W/System.err(3631):     at com.mat.omw.fileoperations.FileSaver.saveDestination(FileSaver.java:41)
03-03 01:56:27.462: W/System.err(3631):     at com.mat.omw.maps.MapDestination.onOptionsItemSelected(MapDestination.java:284)
03-03 01:56:27.462: W/System.err(3631):     at android.app.Activity.onMenuItemSelected(Activity.java:2337)
03-03 01:56:27.462: W/System.err(3631):     at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:795)
03-03 01:56:27.462: W/System.err(3631):     at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:160)
03-03 01:56:27.462: W/System.err(3631):     at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:885)
03-03 01:56:27.462: W/System.err(3631):     at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:545)
03-03 01:56:27.462: W/System.err(3631):     at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122)
03-03 01:56:27.462: W/System.err(3631):     at android.view.View$PerformClick.run(View.java:9293)
03-03 01:56:27.462: W/System.err(3631):     at android.os.Handler.handleCallback(Handler.java:587)
03-03 01:56:27.462: W/System.err(3631):     at android.os.Handler.dispatchMessage(Handler.java:92)
03-03 01:56:27.462: W/System.err(3631):     at android.os.Looper.loop(Looper.java:150)
03-03 01:56:27.462: W/System.err(3631):     at android.app.ActivityThread.main(ActivityThread.java:4277)
03-03 01:56:27.462: W/System.err(3631):     at java.lang.reflect.Method.invokeNative(Native Method)
03-03 01:56:27.462: W/System.err(3631):     at java.lang.reflect.Method.invoke(Method.java:507)
03-03 01:56:27.462: W/System.err(3631):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-03 01:56:27.462: W/System.err(3631):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-03 01:56:27.462: W/System.err(3631):     at dalvik.system.NativeStart.main(Native Method)

Изменить: Прочтите это

Выяснилось, что вы не можете добавить по какой-то причине, не совсем уверен, почему. Изменен код для перезаписи данных каждый раз, но кажется крайне неэффективным.


person Mat    schedule 03.03.2012    source источник
comment
Хороший пост! Ваше изменение не очень заметно, и оно важно, поэтому я выделю его: см. stackoverflow.com / questions / 977873 / objectinputstream-error   -  person Stephen Hosking    schedule 20.11.2014