Be able to identify and load classes that match the exact class used to write the stream. Keep the overhead low for nonversioned classes. Use a stream format that allows the traversal of the stream without having to invoke methods specific to the objects saved in the stream. Externalizable classes will be responsible for their own versioning which is tied to the external format. All data and objects must be read from, or skipped in, the stream in the same order as they were written.
Classes evolve individually as well as in concert with supertypes and subtypes.
Classes are identified by name. Two classes with the same name may be different versions or completely different classes that can be distinguished only by comparing their interfaces or by comparing hashes of the interfaces. Default serialization will not perform any type conversions. The stream format only needs to support a linear sequence of type changes, not arbitrary branching of a type. This takes two forms.