3

I am trying to add an object( of OneChatMessage class) into a file on every button click. And then i try to read all the objects from the file and load it into a ArrayList. But i get a StreamCorruptedException at the second iteration of ObjectInputStream.readObject() in the deserialization function. I have verified that the first iteration works fine.

I have read many other posts on the same issue :

  1. One suggestion(Deserialize multiple Java Objects) is to write the entire array list to the file instead of individual objects. But that seems wasteful, as i need to write to file on every button click and there would be hundreds of objects over time.
  2. Another suggestion(StreamCorruptedException: invalid type code: AC) is to do with different headers created by ObjectOutputStream. I have no idea who to use this knowledge to resolve the issue.

Any idea on how i can resolve this?

OneChatMessage.java :

package com.slapp.chat;

import java.io.Serializable;
import java.util.Date;

import com.slapp.localDB.Contact;

//This class defines the class for a chat message
public class OneChatMessage implements Serializable{
    private String text;
    private Date timeSent;
    private Boolean sentByMe;

    public OneChatMessage(String text, Date timeSent, Boolean sentByMe){
        this.text = text;
        this.timeSent = timeSent;
        this.sentByMe = sentByMe;
    }

    public String getText(){
        return this.text;
    }

    public Date getTimeSent(){
        return this.timeSent;
    }

    @Override
    public String toString(){
        return new StringBuffer(" Text : ")
        .append(this.text)
        .append(" TimeSent : ")
        .append(this.timeSent.toString()) // Need to use SimpleDatFormat to get the correct time zone and formatting. Leaving it for now.
        .append(" SentByMe : ")
        .append(this.sentByMe.toString()).toString();
    }
}

Serializing function :

public void addMessage(OneChatMessage msg) {
        FileOutputStream fos;
        ObjectOutputStream oos;

        File file = new File(context.getFilesDir(), "abc");
        if (!file.exists()) {
            Log.d("faizal",
                    "The file does not exist : ");
        } else {
            Log.d("faizal",
                    "The file already exists : ");
        }
        try {

            fos = context.openFileOutput("abc",
                    Context.MODE_APPEND);
            oos = new ObjectOutputStream(fos);
            oos.writeObject(msg);
            oos.close();
            fos.close();
        } catch (FileNotFoundException e) {
            Log.d("faizal", "file not found : ");
            e.printStackTrace();
        } catch (IOException e) {
            Log.d("faizal", "Error closing file : ");
            e.printStackTrace();
        }
}

Deserializing function :

public ArrayList<OneChatMessage> getAllChatMessagesArrayList() {
        ArrayList<OneChatMessage> chatMessages = new ArrayList<OneChatMessage>();
        OneChatMessage oneChatMsg;
        FileInputStream fis;
        ObjectInputStream ois;

        try {

            fis = context.openFileInput("abc");
            ois = new ObjectInputStream(fis);
            //Setting an arbitrarily large number as the limit of the loop iterations
            //so that chat message are read from the file till EOF
            for (int i = 1; i < 999999999; i++) {
                try {
                    oneChatMsg = (OneChatMessage) ois.readObject();
                } catch (EOFException e) {
                    //When EOFException occurs, quit the loop
                    break;
                }

                try{
                    chatMessages.add(oneChatMsg);
                } catch(Exception e){
                    Log.d("faizal","Error adding message to Array List:" + oneChatMsg.getText());
                    e.printStackTrace();
                }


            }
            ois.close();
            fis.close();

            return chatMessages;
        } catch (FileNotFoundException e) {
            Log.d("faizal", "The file not found : ");
            e.printStackTrace();
        } catch (IOException e) {
            Log.d("faizal", "Error closing file : ");
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            Log.d("faizal","Error reading object from file : ");
            e.printStackTrace();
        } catch (UnsupportedOperationException e) {
            Log.d("faizal", "Error adding object to array list from file : ");
            e.printStackTrace();
        }
        return null; // in case there was a caught exception

    }

Logcat :

05-27 16:56:17.576: W/System.err(25028): java.io.StreamCorruptedException: Wrong format: ac
05-27 16:56:17.576: W/System.err(25028):    at java.io.ObjectInputStream.corruptStream(ObjectInputStream.java:701)
05-27 16:56:17.576: W/System.err(25028):    at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:814)
05-27 16:56:17.576: W/System.err(25028):    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2006)
05-27 16:56:17.576: W/System.err(25028):    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1963)
05-27 16:56:17.576: W/System.err(25028):    at com.slapp.chat.ChatPersistenceHandler.getAllChatMessagesArrayList(ChatPersistenceHandler.java:62)
05-27 16:56:17.576: W/System.err(25028):    at com.example.slapp.ChatSessionActivity$ChatArrayAdapter.<init>(ChatSessionActivity.java:178)
05-27 16:56:17.576: W/System.err(25028):    at com.example.slapp.ChatSessionActivity.onCreate(ChatSessionActivity.java:86)
05-27 16:56:17.576: W/System.err(25028):    at android.app.Activity.performCreate(Activity.java:5372)
05-27 16:56:17.576: W/System.err(25028):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
05-27 16:56:17.576: W/System.err(25028):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2270)
05-27 16:56:17.576: W/System.err(25028):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2362)
05-27 16:56:17.576: W/System.err(25028):    at android.app.ActivityThread.access$700(ActivityThread.java:168)
05-27 16:56:17.576: W/System.err(25028):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1329)
05-27 16:56:17.576: W/System.err(25028):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-27 16:56:17.576: W/System.err(25028):    at android.os.Looper.loop(Looper.java:137)
05-27 16:56:17.576: W/System.err(25028):    at android.app.ActivityThread.main(ActivityThread.java:5493)
05-27 16:56:17.576: W/System.err(25028):    at java.lang.reflect.Method.invokeNative(Native Method)
05-27 16:56:17.576: W/System.err(25028):    at java.lang.reflect.Method.invoke(Method.java:525)
05-27 16:56:17.576: W/System.err(25028):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
05-27 16:56:17.576: W/System.err(25028):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
05-27 16:56:17.576: W/System.err(25028):    at dalvik.system.NativeStart.main(Native Method)
0

1 Answer 1

3

Appending to an ObjectOutputStream doesn't work out of the box as it creates multiple headers as described in StreamCorruptedException: invalid type code: AC.

See Appending to an ObjectOutputStream for a solution.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.