Resolving Objects
Sometimes you may need to replace the objects read from the stream with other, alternative objects. Perhaps an old version of a program used Franc objects, but the new version of the program uses Euro objects. The ObjectInputStream can replace each Franc object read with the equivalent Euro object.
Only trusted subclasses of ObjectInputStream may replace objects. A class is only trusted if it was loaded from the local classpath. To make it possible for a trusted subclass to replace objects, first pass true to its enableResolveObject( ) method:
protected final boolean enableResolveObject(boolean enable) throws SecurityException
Generally, you do this in the constructor of any class that needs to replace objects. Once object replacement is enabled, whenever an object is read, it is passed to the ObjectInputStream subclass's resolveObject( ) method before readObject( ) returns:
protected Object resolveObject(Object o) throws IOException
The resolveObject( ) method may return the object itself (the default behavior) or return a different object. Resolving objects is a tricky business. The substituted object must be compatible with the use of the original object, or errors will soon surface as the program tries to invoke methods or access fields that don't exist. Most of the time, the replacing object is an instance of a subclass of the class of the replaced object. Another possibility is that the replacing object and the object it replaces are both instances of different subclasses of a common superclass or interface, where the original object was only used as an instance of that superclass or interface.