I disagree. I'd output the contents in a text format, like XML, and then read it back in to recreate the objects. I believe there is an XML parser in the Java API, but I've not used it. The reason I don't recommend serialization is because it breaks the moment you alter the classes, which limits how maintainable it can be.
If you do save your levels as plain text then you might find their size becomming quite bloated (like in the magabytes). This can be especially true with all the tags in an XML based format. If this happend then I'd recommend compressing the contents when saved and decompress when you load as plain text compresses _very_ well and should solve this issue.
Well you don't want to write MyCoolEntity directly to the disk, you want to write SavedEntity to the disk that contains information on how to construct the desired MyCoolEntity. As for altering the classes, all you need to do is declare a serialVersionID (paraphrasing the variable name) for any Serializable and then just keep it the same. That will avoid any issues reading old save files unless you drastically change the data. If you're still worried about losing data across versions you can use Externalizable instead of Serializable, but it's quite slow and fairly annoying to use in comparison.
IMO the reason not to bother with text is because it's too easy for people to mess with and ends up with a bloated file size. It's also slower to read and to write. But that's not to say I haven't made text-based level file systems many a time before, because I have.