The book Effective Java and other sources provide a pretty good explanation on how and when to use the readObject() method when working with serializable Java class
readResolve is used for replacing the object read from the stream. The only use I've ever seen for this is enforcing singletons; when an object is read, replace it with the singleton instance. This ensures that nobody can create another instance by serializing and deserializing the singleton.