Each subclass of a serializable object may define its own writeObject method. If a class does not implement the method, the default serialization provided by defaultWriteObject will be used. When implemented, the class is only responsible for having its own fields, not those of its supertypes or subtypes.
The class's writeObject method, if implemented, is responsible for saving the state of the class. The defaultWriteObject method should be called before writing any optional data that will be needed by the corresponding readObject method to restore the state of the object. The responsibility for the format, structure, and versioning of the optional data lies completely with the class.