CONTENTS | PREV | NEXT | Java Object Serialization Specification |
Objects implementingjava.io.Externalizable
must implement thereadExternal
method to restore the entire state of the object. It must coordinate with its superclasses to restore their state. All of the methods ofObjectInput
are available to restore the object's primitive typed fields and object fields.public void readExternal(ObjectInput stream) throws IOException;
Note - ThereadExternal
method is public, and it raises the risk of a client being able to overwrite an existing object from a stream. The class may add its own checks to insure that this is only called when appropriate.
A new stream protocol version has been introduced in JDKTM 1.2 to correct a problem withExternalizable
objects. The old definition ofExternalizable
objects required the local virtual machine to find areadExternal
method to be able to properly read anExternalizable
object from the stream. The new format adds enough information to the stream protocol so serialization can skip anExternalizable
object when the localreadExternal
method is not available. Due to class evolution rules, serialization must be able to skip anExternalizable
object in the input stream if there is not a mapping for the object using the local classes.An additional benefit of the new
Externalizable
stream format is thatObjectInputStream
can detect attempts to read more External data than is available, and can also skip by any data that is left unconsumed by areadExternal
method. The behavior ofObjectInputStream
in response to a read past the end of External data is the same as the behavior when a class-definedreadObject
method attempts to read past the end of its optional data: bytewise reads will return-1
, primitive reads will throwEOFException
s, and object reads will throwOptionalDataException
s with theeof
field set totrue
.Due to the format change, JDKTM 1.1.6 and earlier releases are not able to read the new format. StreamCorruptedException is thrown when JDKTM 1.1.6 or earlier attempts to read an
Externalizable
object from a stream written inPROTOCOL_VERSION_2
. Compatibility issues are discussed in more detail in Section 6.3, "Stream Protocol Versions."