Don't use FieldSerializer, since it doesn't have any compatibility.
I don't like the chunked encoding overhead of CompatibleSerializer.
I prefer TaggedFieldSerializer, which means you must annotate the fields of your classes and cannot (ever!) remove fields. You can rename fields though. When deprecated fields are still read but not written.
See the docs for details.
If a class gets too different, you can register a new class and use a serializer that reads the old class and provides an instance of the new class, optionally setting any data from the old to the new. VersionedFieldSerializer is OK, but TaggedFieldSerializer gives you more options.
If performance is not important, you could use Java's built-in serialization through Kryo (see JavaSerializer).