ObjectInputStream.readObject does not return null on EOF, as your while loop expects. It throws an EOFException. Have a look at the API documentation for the particulars. I don't like relying on exceptions to signal something that is expected, like EOF so I usually store a bunch of objects in a collection of some sort and serialize that. Other folks will recommend first writing the number of objects to the stream, then writing the objects.