There's two reasons for this exception:
# An attempt was made to read an object when the next element in the stream is primitive data. In this case, the OptionalDataException's length field is set to the number of bytes of primitive data immediately readable from the stream, and the eof field is set to false.
# An attempt was made to read past the end of data consumable by a class-defined readObject or readExternal method. In this case, the OptionalDataException's eof field is set to true, and the length field is set to 0.
Java Doc for OptionalDataException
So if you want to check for the particular cause, you can examine the eof and length fields.
Are you reading the array list with a single readObject() call?